Changeset 851


Ignore:
Timestamp:
06/08/09 16:45:56 (16 years ago)
Author:
Eric.Larour
Message:

New transient 3d parallel solution

Location:
issm/trunk/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/Makefile.am

    r848 r851  
    224224                                        ./UpdateGeometryx/UpdateGeometryx.h\
    225225                                        ./UpdateGeometryx/UpdateGeometryx.cpp\
     226                                        ./UpdateNodePositionsx/UpdateNodePositionsx.h\
     227                                        ./UpdateNodePositionsx/UpdateNodePositionsx.cpp\
    226228                                        ./ConfigureObjectsx/ConfigureObjectsx.h\
    227229                                        ./ConfigureObjectsx/ConfigureObjectsx.cpp\
     
    492494                                        ./UpdateGeometryx/UpdateGeometryx.h\
    493495                                        ./UpdateGeometryx/UpdateGeometryx.cpp\
     496                                        ./UpdateNodePositionsx/UpdateNodePositionsx.h\
     497                                        ./UpdateNodePositionsx/UpdateNodePositionsx.cpp\
    494498                                        ./ConfigureObjectsx/ConfigureObjectsx.h\
    495499                                        ./ConfigureObjectsx/ConfigureObjectsx.cpp\
  • issm/trunk/src/c/parallel/transient_core.cpp

    r823 r851  
    2121
    2222        int dim=-1;
    23        
    24        
     23
     24
    2525        fem_p=fems+5;
    2626
  • issm/trunk/src/c/parallel/transient_core_2d.cpp

    r850 r851  
    150150                result=new Result(results->Size()+1,time,step,"b_g",b_g); results->AddObject(result);
    151151        }
     152
     153        /*Free ressources:*/
     154        xfree((void**)&u_g_serial);
     155        xfree((void**)&p_g_serial);
     156        xfree((void**)&h_g_serial);
     157        xfree((void**)&s_g_serial);
     158        xfree((void**)&b_g_serial);
    152159}
  • issm/trunk/src/c/parallel/transient_core_3d.cpp

    r823 r851  
    44
    55#undef __FUNCT__
    6 #define __FUNCT__ "transient_core_3d"
     6#define __FUNCT__ "transient_3d_core"
    77
    88#include "../toolkits/toolkits.h"
     
    1515void transient_core_3d(DataSet* results,FemModel* fems, ParameterInputs* inputs){
    1616
    17         throw ErrorException(__FUNCT__," 3d transient not supported yet!");
    18 
    19 
     17        extern int my_rank;
     18
     19        /*fem models: */
     20        FemModel* fem_dh=NULL;
     21        FemModel* fem_dv=NULL;
     22        FemModel* fem_dhu=NULL;
     23        FemModel* fem_ds=NULL;
     24        FemModel* fem_sl=NULL;
     25        FemModel* fem_p=NULL;
     26        FemModel* fem_t=NULL;
     27        FemModel* fem_m=NULL;
     28
     29        /*output: */
     30        Result* result=NULL;
     31
     32        /*solutions: */
     33        int step;
     34        double time;
     35       
     36        Vec u_g=NULL;
     37        double* u_g_serial=NULL;
     38        Vec p_g=NULL;
     39        double* p_g_serial=NULL;
     40        Vec h_g=NULL;
     41        Vec h_g_intermediary=NULL;
     42        double* h_g_serial=NULL;
     43        Vec s_g=NULL;
     44        double* s_g_serial=NULL;
     45        Vec b_g=NULL;
     46        double* b_g_serial=NULL;
     47        Vec t_g=NULL;
     48        Vec t_g_average=NULL;
     49        double* t_g_serial=NULL;
     50        Vec m_g=NULL;
     51        double* m_g_serial=NULL;
     52
     53        /*intermediary: */
     54        double finaltime;
     55        double dt;
     56        double yts;
     57        DataSet* temperature_results=NULL;
     58        DataSet* diagnostic_results=NULL;
     59        DataSet* prognostic_results=NULL;
     60
     61
     62        /*flags: */
     63        int debug=0;
     64        int numberofnodes;
     65
     66        /*dof recovery: */
     67        int dof01[2]={0,1};
     68        int dof2[1]={2};
     69        int dof012[3]={0,1,2};
     70        int dof3[1]={3};
     71
     72        /*recover fem models: */
     73        fem_dh=fems+0;
     74        fem_dv=fems+1;
     75        fem_ds=fems+2;
     76        fem_dhu=fems+3;
     77        fem_sl=fems+4;
     78        fem_p=fems+5;
     79
     80        fem_t=fems+6;
     81        fem_m=fems+7;
     82
     83        //first recover parameters common to all solutions
     84        fem_dh->parameters->FindParam((void*)&debug,"debug");
     85        fem_dh->parameters->FindParam((void*)&finaltime,"ndt");
     86        fem_dh->parameters->FindParam((void*)&dt,"dt");
     87        fem_dh->parameters->FindParam((void*)&yts,"yts");
     88        fem_dh->parameters->FindParam((void*)&numberofnodes,"numberofnodes");
     89
     90        /*initialize: */
     91        step=1;
     92        time=0;
     93       
     94        fem_p->parameters->FindParam((void*)&u_g_serial,"u_g");
     95        u_g=SerialToVec(u_g_serial,2*numberofnodes); xfree((void**)&u_g_serial);
     96
     97        fem_p->parameters->FindParam((void*)&p_g_serial,"p_g");
     98        p_g=SerialToVec(p_g_serial,1*numberofnodes); xfree((void**)&p_g_serial);
     99
     100        fem_p->parameters->FindParam((void*)&h_g_serial,"h_g");
     101        h_g=SerialToVec(h_g_serial,1*numberofnodes); xfree((void**)&h_g_serial);
     102
     103        fem_p->parameters->FindParam((void*)&s_g_serial,"s_g");
     104        s_g=SerialToVec(s_g_serial,1*numberofnodes); xfree((void**)&s_g_serial);
     105
     106        fem_p->parameters->FindParam((void*)&b_g_serial,"b_g");
     107        b_g=SerialToVec(b_g_serial,1*numberofnodes); xfree((void**)&b_g_serial);
     108
     109        fem_p->parameters->FindParam((void*)&t_g_serial,"t_g");
     110        t_g=SerialToVec(t_g_serial,1*numberofnodes); xfree((void**)&t_g_serial);
     111
     112        fem_p->parameters->FindParam((void*)&m_g_serial,"m_g");
     113        m_g=SerialToVec(m_g_serial,1*numberofnodes); xfree((void**)&m_g_serial);
     114
     115        /*Add all these initial vectors in the results!: */
     116        result=new Result(results->Size()+1,time,step,"u_g",u_g); results->AddObject(result);
     117        result=new Result(results->Size()+1,time,step,"p_g",p_g); results->AddObject(result);
     118        result=new Result(results->Size()+1,time,step,"h_g",h_g); results->AddObject(result);
     119        result=new Result(results->Size()+1,time,step,"s_g",s_g); results->AddObject(result);
     120        result=new Result(results->Size()+1,time,step,"b_g",b_g); results->AddObject(result);
     121        result=new Result(results->Size()+1,time,step,"t_g",t_g); results->AddObject(result);
     122        result=new Result(results->Size()+1,time,step,"m_g",m_g); results->AddObject(result);
     123
     124        while(time<finaltime+dt){ //make sure we run up to finaltime.
     125       
     126                if(debug)_printf_("%s%g%s%i%s%g\n","time [yr]: ",time/yts,"    iteration number: ",step,"/",floor(finaltime/dt));
     127
     128                step+=1;
     129                time+=dt;
     130
     131                //update inputs
     132                inputs->Add("thickness",h_g,1,numberofnodes);
     133                inputs->Add("surface",s_g,1,numberofnodes);
     134                inputs->Add("bed",b_g,1,numberofnodes);
     135                inputs->Add("velocity",u_g,2,numberofnodes);
     136                inputs->Add("pressure",p_g,1,numberofnodes);
     137                inputs->Add("temperature",t_g,1,numberofnodes);
     138
     139                //Deal with temperature first
     140                if(debug)_printf_("%s\n","computing temperature");
     141                temperature_results=new DataSet(ResultsEnum());
     142                thermal_core(results,fems+6, inputs);
     143               
     144                //extract t_g and m_g from thermal, and erase thermal results;
     145                temperature_results->FindResult(&t_g,"t_g");
     146                temperature_results->FindResult(&m_g,"m_g");
     147
     148                //Compute depth averaged temperature and add to inputs
     149                if(debug)_printf_("%s\n","computing depth average temperature");
     150                VecDuplicatePatch(&t_g_average,t_g);
     151                FieldDepthAveragex( t_g_average, fem_t->elements,fem_t->nodes, fem_t->loads, fem_t->materials,"temperature");
     152                inputs->Add("temperature_average",t_g_average,1,numberofnodes);
     153                VecFree(&t_g_average); //not needed anymore
     154
     155                //Deal with velocities.
     156                diagnostic_results=new DataSet(ResultsEnum());
     157                diagnostic_core(diagnostic_results,fems, inputs);
     158
     159                //extract u_g and p_g from diagnostic_results, and erase diagnostic_results;
     160                diagnostic_results->FindResult(&u_g,"u_g");
     161                diagnostic_results->FindResult(&p_g,"p_g");
     162                delete diagnostic_results;
     163
     164                //compute new thickness
     165                if(debug)_printf_("%s\n","computing new thickness");
     166               
     167                inputs->Add("velocity",u_g,2,numberofnodes);
     168                prognostic_results=new DataSet(ResultsEnum()); prognostic_core(prognostic_results,fem_p, inputs);
     169       
     170                //extract h_g prognostic_results, and erase prognostic_results;
     171                prognostic_results->FindResult(&h_g_intermediary,"h_g");
     172                delete prognostic_results;
     173
     174                //update surface and bed using the new thickness
     175                if(debug)_printf_("   updating geometry\n");
     176                UpdateGeometryx(&h_g,&b_g,&s_g,
     177                                fem_p->elements, fem_p->nodes,fem_p->loads, fem_p->materials,
     178                                h_g_intermediary,b_g,s_g);
     179                VecFree(&h_g_intermediary);
     180               
     181                if(debug)_printf_("%s\n","updating node positions");
     182                UpdateNodePositionsx( fem_dh->elements,fem_dh->nodes,fem_dh->loads,fem_dh->materials,h_g,b_g);
     183                UpdateNodePositionsx( fem_dv->elements,fem_dv->nodes,fem_dv->loads,fem_dv->materials,h_g,b_g);
     184                UpdateNodePositionsx( fem_ds->elements,fem_ds->nodes,fem_ds->loads,fem_ds->materials,h_g,b_g);
     185                UpdateNodePositionsx( fem_sl->elements,fem_sl->nodes,fem_sl->loads,fem_sl->materials,h_g,b_g);
     186                UpdateNodePositionsx( fem_p->elements,fem_p->nodes,fem_p->loads,fem_p->materials,h_g,b_g);
     187                UpdateNodePositionsx( fem_p->elements,fem_p->nodes,fem_p->loads,fem_p->materials,h_g,b_g);
     188                UpdateNodePositionsx( fem_t->elements,fem_t->nodes,fem_t->loads,fem_t->materials,h_g,b_g);
     189                UpdateNodePositionsx( fem_m->elements,fem_m->nodes,fem_m->loads,fem_m->materials,h_g,b_g);
     190
     191                //plug into results.
     192                result=new Result(results->Size()+1,time,step,"u_g",u_g); results->AddObject(result);
     193                result=new Result(results->Size()+1,time,step,"p_g",p_g); results->AddObject(result);
     194                result=new Result(results->Size()+1,time,step,"h_g",h_g); results->AddObject(result);
     195                result=new Result(results->Size()+1,time,step,"s_g",s_g); results->AddObject(result);
     196                result=new Result(results->Size()+1,time,step,"b_g",b_g); results->AddObject(result);
     197        }
     198
     199        /*Free ressources:*/
     200        xfree((void**)&u_g_serial);
     201        xfree((void**)&p_g_serial);
     202        xfree((void**)&h_g_serial);
     203        xfree((void**)&s_g_serial);
     204        xfree((void**)&b_g_serial);
     205        xfree((void**)&t_g_serial);
     206        xfree((void**)&m_g_serial);
    20207}
  • issm/trunk/src/m/solutions/cielo/transient3d.m

    r849 r851  
    115115        %end
    116116
    117         %update nodes
     117        %update node positions
    118118        displaystring(md.debug,'   updating node positions...'));
    119119        nodes_dh=UpdateNodePositions(m_dh.elements,m_dh.nodes,m_dh.loads,m_dh.materials,new_bed,new_thickness);
Note: See TracChangeset for help on using the changeset viewer.