/****************************************************************************** Eulero codice per il calcolo del flusso potenziale su un corpo generico non portante tridimensionale - dal metodo di Hess Smith Copyright (C) 1999 Matteo Lucarelli - matteo@matteolucarelli.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ******************************************************************************/ #include #include #include #include #include #define SQ(a) ((a)*(a)) #define MAX(a,b) ( (a) > (b) ? (a) : (b) ) #define MAXNUM 1e+6 /* sostitutivo di infinito */ #define TIPOD float /******** tipo di dati *********/ #define punto(a,b,c) *(punto+(a)*12+(b)*3+c) #define prel(a,b,c) *(prel+(a)*8+(b)*2+c) #define pmedio(a,b) *(pmedio+(a)*3+b) #define rotazione(a,b,c) *(rotazione+(a)*9+(b)*3+c) #define np(a,b) *(np+(a)*3+b) #define minf(a,b) *(minf+(a)*nelem+b) #define vnex(a) *(vnex+a) #define intens(a) *(intens+a) #define d12(a) *(d12+a) #define d23(a) *(d23+a) #define d34(a) *(d34+a) #define d41(a) *(d41+a) #define m12(a) *(m12+a) #define m23(a) *(m23+a) #define m34(a) *(m34+a) #define m41(a) *(m41+a) #define etasud12(a) *(etasud12+a) #define etasud23(a) *(etasud23+a) #define etasud34(a) *(etasud34+a) #define etasud41(a) *(etasud41+a) #define xisud12(a) *(xisud12+a) #define xisud23(a) *(xisud23+a) #define xisud34(a) *(xisud34+a) #define xisud41(a) *(xisud41+a) #define area(n) *(area+n) #define assc(a) *(assc+a) #define relc(a) *(relc+a) #define npr(a) *(npr+a) /* variabili globali allocate dinamicamente nella sub loaddati */ char nome[20]=" "; /* nome del file (.din:dati input .don:dati output) */ int nelem=0; /* n° di elementi del corpo */ int tiposimm; /* tipo di simmetria applicabile */ TIPOD vex[3]; /* vettore velocità esterna */ TIPOD *punto=NULL; /* matrice nelem*4*3 :coordinate vertici degli elementi ordinati in senso orario visti dal lato del flusso*/ TIPOD *pmedio=NULL; /* matrice nelem*3 : coordinate punti medi */ TIPOD *rotazione=NULL; /* matrice nelem*3*3 : tensori di rotazione */ TIPOD *np=NULL; /* matrice nelem*3 : coordinate dei null point */ TIPOD *minf=NULL; /* matrice nelem*nelem : matrice di influenza */ TIPOD *vnex=NULL; /* vettore nelem : comp. normale vel. esterna */ TIPOD *intens=NULL; /* vettore nelem : intensità sorgenti (solution) */ /* quantità globali utili */ TIPOD *prel=NULL; /* array nelem*4*2 */ TIPOD *d12=NULL; /* vettore (nelem) */ TIPOD *d23=NULL; /* " " */ TIPOD *d34=NULL; /* " " */ TIPOD *d41=NULL; /* " " */ TIPOD *m12=NULL; /* " " */ TIPOD *m23=NULL; /* " " */ TIPOD *m34=NULL; /* " " */ TIPOD *m41=NULL; /* " " */ TIPOD *etasud12=NULL; /* " " */ TIPOD *etasud23=NULL; /* " " */ TIPOD *etasud34=NULL; /* " " */ TIPOD *etasud41=NULL; /* " " */ TIPOD *xisud12=NULL; /* " " */ TIPOD *xisud23=NULL; /* " " */ TIPOD *xisud34=NULL; /* " " */ TIPOD *xisud41=NULL; /* " " */ TIPOD *area=NULL; /* " " */ /****************************************MAIN**********************************/ void main(void) { int r; char c; void loaddati(void); void calgeo(void); void calutili(void); void calnp(void); void calminf(void); void risolvi(void); void calvelnp(int r); void savedati(void); void savealtri(int r); printf("EULERO\ncalcolo del flusso potenziale\n"); loaddati(); /* carica da disco le coordinate dei punti del corpo */ /* elimina gli elementi di area nulla */ /* alloca gli array dinamici globali */ calgeo(); /* calcoli geometrici */ calutili(); /* calcola costanti utili */ calnp(); /* calcola i null points */ calminf(); /* calcola la matrice di influenza */ risolvi(); /* calcola la vel esterna e risolve il sistema */ do { printf("\nInserire una opzione\n"); printf(" 1-uscita\n 2-ricalcolo intesità con altra vel ext\n"); printf(" 3-calcolo velocità nei null point\n"); printf(" 4-salvataggio coordinate proiettate\n"); printf(" 5-salvataggio coordinate null point\n"); printf(" 6-salvataggio matrice di influenza\n"); printf(" 7-salvataggio vettore termini noti\n"); printf(" 8-salvataggio intensità\n"); printf(" 9-calcolo Cpr nei null point\n? "); scanf("%s",&c); r=c-48; if (r==2) { risolvi(); savedati(); } if (r==3) calvelnp(r); if ((r>3)&&(r<8)) savealtri(r); if (r==8) savedati(); if (r==9) calvelnp(r); } while (!(r==1)) ; printf("Esecuzione terminata\n"); exit(0); } /**********************************LOADDATI************************************/ /* routine di caricamento dati */ /* legge da disco i dati di input dal file nome.din */ /* i dati sono in formato binario */ /* primi 4 byte (intero) : n° elementi del corpo in esame */ /* successivi nelem*4*3*8 byte (TIPOD) : array punto */ void loaddati(void) { FILE *fp ; size_t sod ; int j,k,b,c ; char r ; /* caricamento dati da disco */ printf("\nNome del file coordinate del corpo (max 8 char): "); scanf("%s",nome); nome[8]=0; printf("Tipo di simmetria applicabile :\n- 0 : nessuna\n"); printf("- 1 : z -> -z\n"); printf("- 2 : x -> -x\n- 3 : y -> -y"); do { printf("\n? "); scanf("%s",&r) ; tiposimm=r-48 ; } while((tiposimm<0)||(tiposimm>3)); if((fp=fopen(strcat(nome,".din") , "rb"))==NULL) { printf("errore apertura file"); exit(1); } printf("Caricamento dati dal file %s\n",nome); nome[strlen(nome)-4]=0; /* toglie l'estensione */ sod=sizeof(TIPOD); fread(&nelem,sizeof(int),1,fp); /* carica nelem */ punto=(TIPOD *)calloc((size_t)(12*nelem),sod); /* alloca punto */ fread(punto,sod,(size_t)12*nelem,fp); /* carica array punto */ fclose(fp); printf("N'elementi caricati :%d\n",nelem); /* eliminazione elementi con area nulla */ printf("Controllo elementi ad area nulla :"); for(j=0;jprel(n,2,0))||(cnpnext[0]prel(n,1,1))||(cnpnext[1]errmax)&& (!((vx==0)&(vy==0)))); antitrasf(cnpnext,n,1); for(k=0;k<3;k++) np(n,k) = cnpnext[k]; } printf("Eseguito\n"); return; } /******************************CALMINF*****************************************/ /******************rutine di calcolo della matrice di influenza****************/ void calminf(void) { void antitrasf(TIPOD *rel_coord,int elem_rif,int flag_trasla); void trasf(TIPOD *ass_coord,int elem_rif,int flag_trasla); void esatto(TIPOD *npr,int n,TIPOD *vel); int n,k,j; /* contatori */ TIPOD vel[3],npr[3]; /* velocità influente null point relativo */ printf("Calcolo della matrice di influenza : "); for(n=0;n(-1) ; k-- ) { quot = vnex(k); for( j=(k+1) ; j