Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C++ to Fortran] Conversione o riscrittura piccolissimo programma

    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 !!!

  2. #2
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    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...

  3. #3
    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 ... per fortuna il grosso , cioe' riscrivere il tutto , e metterlo meglio , l'ho fatto

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

  4. #4
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    Allora... per scrivere in un file devi usare

    codice:
    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ì:
    codice:
    do i = 0, n
     ....
    end do
    che corrisponde in c
    codice:
    for( i = 0, i < n, i++)


    oppure
    codice:
    do i = 0, n,4
     ....
    end do
    che corrisponde in c
    codice:
    for( i = 0, i < n, i+=4)
    Una domanda...
    "implicit none" cosa vuol dire?

  5. #5
    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 !!!

  6. #6
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    ah ok grazie...

  7. #7
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.