PDA

Visualizza la versione completa : [FORTRAN] Conversione di un programma da C++


opal2k5
28-05-2007, 01:12
Premetto che so praticamente nulla di programmazione purtroppo e che purtroppo in una prima ricerca trovare qualcuno competente con linguaggi "scientifici" e' stata dura ..
sta di fatto che per la Tesi mi sia stato chiesto , all'ultimo o melgio venerdi', di scrivere poche righe di codice per confrontare i risultati che si ottengono con 3 diverse funzioni ( formule ricavate sperimentalmente che dovrebbero descrivere lo stesso fenomeno fisico , nel mio caso conduttivita' di un nanofluido )

Considerando che non so nulla di programmazione, avevo gia' scritto la mia tesi, sono rimasto spiazzato dal dover imparare un linguaggio come il fortran ( specificatamente mi era stato chiesto di usare compaq visual fortran ) per implementare qualche riga di codiche ( 3 formule in croce ) entro martedi' ..

preso da buona volonta' cmq ( e nn potendo dire di no! ) mi sono fatto aiutare da 1 amico a scrivere in velocita'il programma in c++ ( unico linguaggio di cui qualcosina ricordavo anche se davvero poco ) pensando di riuscire al porting in fortran ( scoprendo che il contrario e' fattibile mentre nn C++ to Fortran ) !!

Chiedo umilmente se potete darmi qualche consiglio per riscrivere il programma ( che poi dovrei implementare anche meglio .. e' stato un lavoro fatto in fretta e male ) o come trasformarlo..

provo a postarlo ( sono poche righe ) sperando in qualche aiuto all'ultimo momento ( martedi' e' vicinissimo , nemmeno il tempo di contattare qualcuno )

--------------------------------------------------------------

#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;

double bolz=1.381*(pow(10.0,-23)); !costante di boltzman
double pi=3.14159; ! pigreco
double c=1;
double prh2o=5.8; ! num di prandtl x acqua
double preg=150; ! num di prandtl x glicole etilenico EG
double a=4*(pow(10.0,4));
double m=2.5;

double hamiltoncrosser(double kp,double kb,double n,double f){ !f frazione volumetrica
double x=((kp+(((3/n)-1)*kb)-(((3/n)-1)*(kb-kp)*f))/(kp+(((3/n)-1)*kb)+((kb-kp)*f)));
return x;
}


double kumar(double t,double dp,double f,double db,double kb,double v){
double x=(((((2*bolz*t)/(pi*v*dp*dp)))*((f*db/2)/(kb*(1-f)*(dp/2))))*c)+1;
return x;
}

double reynolds(double kb,double t,double p,double dp,double v){
double x=(1/v)*sqrt((18*(kb*t))/(pi*p*dp));
return x;
}

double prasher(double kp,double kb,double f,double pr,double rey){
double x=((kp+(2*kb)+2*(kp-kb)*f)/(kp+(2*kb)-(kp-kb)*f))*(a*pow(rey,m)*pow(pr,0.333)*f);
return x;
}

int main() {
double ham;
double kum;
double pra;
double rey;
cout<<"Desideri usare acqua o glicoletilenico?"<<endl<<"1)Acqua"<<endl<<"2)EG"<<endl;
int x;
cin>>x;
cout<<"Calcolo il valore con Hamilton-Crosser"<<endl;
cout<<"Inserisci il valore della conduttivita' termica delle nanoparticelle"<<endl;
double kp;
cin>>kp;
cout<<"Inserisci la sfericita' delle nanoparticelle"<<endl;
double n;
cin>>n;
cout<<"Inserisci la frazione volumetrica delle nanoparticelle"<<endl;
double f;
cin>>f;
if(x==1){ham=hamiltoncrosser(kp,0.613,n,f);}
else {ham=hamiltoncrosser(kp,0.253,n,f);}
cout<<"Valore calcolato con la formula di Hamilton-Crosser:"<<ham<<endl;
cout<<"Calcolo il valore con Kumar"<<endl;
cout<<"Inserisci il valore della temperatura"<<endl;
double t;
cin>>t;
cout<<"Inserisci il valore del diametro medio nanoparticellare"<<endl;
double dp;
cin>>dp;
cout<<"Inserisci il valore della viscosita' dinamica del fluido"<<endl;
double v;
cin>>v;
if(x==1){kum=kumar(t,dp,f,0.00,0.613,v);}
else{kum=kumar(t,dp,f,0.00,0.253,v);}
cout<<"Valore calcolato con la formula di Kumar:"<<kum<<endl;
cout<<"Calcolo il valore con Prasher"<<endl;
cout<<"Inserisci il valore della densita' della nanoparticella"<<endl;
double p;
cin>>p;
if(x==1){
rey=reynolds(0.613,t,p,dp,v);
pra=prasher(kp,0.613,f,prh2o,rey);
}
else{
rey=reynolds(0.253,t,p,dp,v);
pra=prasher(kp,0.253,f,preg,rey);
}
cout<<"Valore calcolato con la formula di Prasher:"<<pra<<endl;
}
----------------------------------------------------------------

innanzitutto c'e' da dire che lo scopo e' trovare corrispondenza tra la mia x ( per chi mastica termotecnica e' la conduttivita' della sospensione normalizzata , cioe' quella della miscela / quella del fluido base ... ) e la mia variabile f

con questo programma per trovare un valore di x devo ogni volta inserire TUTTE le variabili .... vorrei poter specificare valore di tutte le variabili e che il programma stesso ricavasse tipo 1 tabella per la mia f che varia in un range ( chenneso' nel mio caso se 0.00 < f < 2 che trovasse x corrispondente per ogni valore del campo con passo prescelto , a multiplo di 0.05 ... cioe' per f= 0 per = 0.05 per = 0.10 po 0.15 e cosi' via penso abbia reso l'idea )
E' POSSIBILE fare 1 cosa simile ( sicuramente immagino possibile , ma diciamo possibile nel senso semplice da implementare) ???

l'output puo' essere salvato in formato txt o xls o qualsiasi cosa ?? ( mi ricordo che si poteva ma fortran non lo conosco ) o occorre qualche programma particolare per fare cio'??


mi scuso in anticipo per queste domande niubbissime e quasi offensive all'intelligenza umana , ma mi trovo alle strette e qualsiasi consiglio / aiuto in questo momento fa la differenza (momento in cui nn nn ho 1 manuale x fortran F90 sintetico , o tempo di leggere quei malloppi da 1000 e rotte pagine che ho trovato in rete ) ...

ps: c'e' qualcosa di piu' isi per sviluppare che sto compaq visual fortran che mi ha dato la facolta' ?! Immagino sia 1 ottimo ambiente di sviluppo ma gia' faccio fatica ad aprirlo...

grazie ancora in anticipo per qualsiasi consiglio !!!

Il Pazzo
28-05-2007, 11:26
Usa il force 2.qualcosa ... per il programma posso provare a riscrivere il tuo in fortran ma non ti prometto nulla perchè sono anch'io alle prime armi con fortran...

opal2k5
28-05-2007, 11:40
Originariamente inviato da Il Pazzo
Usa il force 2.qualcosa ... per il programma posso provare a riscrivere il tuo in fortran ma non ti prometto nulla perchè sono anch'io alle prime armi con fortran...


grazie grazie .. ma alla fine ho riscritto stanotte il tutto !!! cioe' ho preso in mano il visual fortran della compaq e con molta pazienza ho implementato bene

mi rimangono solo 2 problemi :
posto esempio :
--------------------------------------------------------------------
program FormulaPrasher
implicit none
real reynolds ! Numero di Reynolds
real bolz ! Costante di Boltzman
integer t ! temperatura
real pi ! PiGreco
real p ! densita' nanoparticelle
real dp ! diametro medio nanoparticelle
real v ! viscosità dinamica fluido
real prasher
real kp ! conduttività nanoparticelle
real kb ! conduttività fluido base
real f ! frazione volumetrica
real m ! costante eq prasher dipendente dal liquido
real a ! cost eq prasher dipendente nanopart e fluido
real pr ! numero di Prandtl
integer nanoparticella
integer fluidobase

a = 4*(10**4)
pi = 3.1416
bolz = 1.38*(10**(-23))


write (*,*) 'Calcolo il valore della conduttività termica normalizzata del nanofluido'&
'usando la formula di Prasher'


! scelgo se usare acqua o EG
write (*,*) 'Desideri usare acqua o glicoletilenico?'&
'1) Acqua Demineralizzata'&
'2) Glicol Etilenico'
read (*,*) fluidobase

! scelgo il tipo di nanoparticella
write (*,*) 'Scegli il tipo di nanoparticellato da utilizzare'&
'1) Allumina'&
'2) Rame'&
'3) Ossido di rame'
read (*,*) nanoparticella

! richiedo il diametro medio delle nanoparticelle adoperate
write (*,*) 'Inserisci il diametro medio delle nanoparticelle in soluzione'
read (*,*) dp

! richiedo la temperatura a cui vogliamo operare (in gradi kelvin)
write (*,*) 'Inserisci la temperatura T a cui operare'
read (*,*) t

! richiedo la frazione volumetrica delle nanoparticelle presenti in soluzione
write (*,*) 'inserisci la frazione volumetrica delle nanoparticelle presenti in soluzione'
read (*,*) f


! implemento le caratteristiche a seconda del tipo di fluido scelto
if ( fluidobase == 1 ) then
kb = 0.613
v = 10**(-3)
m = 2.5
pr = 6.8
else
kb = 0.253
v = 21*(10**(-3))
m = 1.6
pr = 205
endif

! implemento le caratteristiche a seconda del tipo di nanoparticella scelta
if ( nanoparticella == 1 ) then
kp = 40.0
p = 3940
elseif( nanoparticella == 2 ) then
kp = 401.0
p = 8920
else
kp = 76.5
p = 6.480
endif

! calcolo il numero di reynolds
reynolds =(1/v)*sqrt((18*bolz*t)/(pi*p*dp))


! calcolo coefficiente conduttività termica normalizzato secondo Prasher
prasher = ((kp+(2*kb)+2*(kp-kb)*f)/(kp+(2*kb)-(kp-kb)*f))*(1 + (a*reynolds**m)*(pr**0.333))

write (*,*) 'la conducibilità termica della miscela nanofluidica scelta secondo la Formula di Prasher è'

write (*,*) prasher

end
----------------------------------------------------------------------

1) la parte finale ( quella che ho segnato in rosso ) e' sbagliata... anche se il compiler nn mi da' errore , non mi da output quando faccio andare il programma compilato ...
penso che il comando da utilizzare sia diverso !! .. poi non riesco a trovare il sistema perche' output sia quancosa tipo : o una tabella in formato .txt o xls o simile ... so che potrei direttamente implementare anche un output grafico ma sono alle prime armi e nn saprei da dove cominciare ( nn ho nemmeno un esempio )

2) vorrei implementare per la frazione volumetrica qualcosa tipo "FOR" cioe' come scrivevo sopra , che io nn debba inserire i dati ma che si generi l'output prendendo in esame un range ( tipo 0<f<2 con passi di 0.05 )

se qualche anima pia mi sa indicare anche solo in maniera riassuntiva di come fare gliene sarei grato in eterno :D ... per fortuna il grosso , cioe' riscrivere il tutto , e metterlo meglio , l'ho fatto :D

ps : grazie ancora millissime a IlPazzo per la disponibilita' !!

Il Pazzo
28-05-2007, 11:57
Allora... per scrivere in un file devi usare



write(3,*) ......


Non so come si fa a dare l'estensione al file però.... così ti dovrebbe creare un file fort.3 che puoi aprire tranquillamente con il notepad (se lo scopri fammi sapere)

Il for in dortran si fa così:


do i = 0, n
....
end do


che corrisponde in c


for( i = 0, i < n, i++)




oppure


do i = 0, n,4
....
end do


che corrisponde in c


for( i = 0, i < n, i+=4)


Una domanda...
"implicit none" cosa vuol dire?

opal2k5
28-05-2007, 12:55
Originariamente inviato da Il Pazzo

"implicit none" cosa vuol dire?

mi e' stato consigliato di disabilitare la funzione di F90-95 che assegna da solo i tipi di variabile ...
molto comodo per trovare errori in compilazione ...
unica rottura che se vedi all'inizio devo specificare per ogni cosa real o integer o quant'altro ...

in teoria se nn avessi inserito "implicit none" nn sarebbe necessario

grazie mille per avermi illuminato sulla funzione DO !!!

Il Pazzo
28-05-2007, 13:17
ah ok grazie...

opal2k5
28-05-2007, 13:54
risolto da solo il problema del write finale ... che cojon ...
--------------------------------------------------
write (*,*) 'la conducibilità termica della miscela nanofluidica scelta secondo la Formula di Prasher è'
write (*,*) prasher
end
---------------------------------------------------

va scritto :

---------------------------------------------------

write (*,*) 'la conducibilità termica della miscela nanofluidica scelta secondo la Formula di Prasher è' , prasher

end

-----------------------------------------------------

vabbe' adesso implemento il DO e poi ho bello che finito...
da ieri che nn sapevo nemmeno quasi cosa fosse il fortran , a oggi nn e' stato male come miglioramente :D

Loading