8 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
13 #include "../cores/cores.h"
14 #include "../shared/io/io.h"
17 #include "../shared/Enum/Enum.h"
18 #include "../analyses/analyses.h"
25 extern CoDi_global codi_global;
28 #if defined(_HAVE_NEOPZ_) && !defined(_HAVE_AD_)
29 #include <TPZRefPatternDataBase.h>
33 #include "../modules/ModelProcessorx/ModelProcessorx.h"
34 #include "../modules/SpcNodesx/SpcNodesx.h"
35 #include "../modules/ConfigureObjectsx/ConfigureObjectsx.h"
36 #include "../modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.h"
37 #include "../modules/GetVectorFromInputsx/GetVectorFromInputsx.h"
38 #include "../modules/InputUpdateFromVectorx/InputUpdateFromVectorx.h"
39 #include "../modules/NodesDofx/NodesDofx.h"
40 #include "../modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.h"
41 #include "../modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.h"
42 #include "../modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.h"
43 #include "../modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.h"
44 #include "../modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.h"
45 #include "../modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h"
46 #include "../modules/ThicknessAlongGradientx/ThicknessAlongGradientx.h"
47 #include "../modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.h"
48 #include "../modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.h"
49 #include "../modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.h"
50 #include "../modules/NodalValuex/NodalValuex.h"
51 #include "../modules/GetVectorFromInputsx/GetVectorFromInputsx.h"
52 #include "../modules/AverageOntoPartitionx/AverageOntoPartitionx.h"
63 char *lockfilename = NULL;
64 char *binfilename = NULL;
65 char *outbinfilename = NULL;
66 char *petscfilename = NULL;
67 char *restartfilename = NULL;
68 char *rootpath = NULL;
75 PETSC_COMM_WORLD=incomm;
76 ierr=PetscInitialize(&argc,&argv,(
char*)0,
"");
if(ierr)
_error_(
"Could not initialize Petsc");
97 #if defined(_HAVE_NEOPZ_) && !defined(_HAVE_AD_)
100 #if defined(_HAVE_BAMG_) && !defined(_HAVE_AD_)
101 this->amrbamg = NULL;
103 #if !defined(_HAVE_AD_)
107 int domaintype,element_type;
112 if(
analysis_counter==-1)
_error_(
"Could not find alias for analysis_type StressbalanceAnalysisEnum in list of FemModel analyses\n");
118 if(!isSSA)
_error_(
"Flow equation not supported with AMR yet!\n ");
124 #if defined(_HAVE_NEOPZ_)
125 case AmrNeopzEnum: this->InitializeAdaptiveRefinementNeopz();
break;
128 #if defined(_HAVE_BAMG_)
129 case AmrBamgEnum: this->InitializeAdaptiveRefinementBamg();
break;
132 default:
_error_(
"not implemented yet");
138 xDelete<char>(lockfilename);
139 xDelete<char>(binfilename);
140 xDelete<char>(outbinfilename);
141 xDelete<char>(petscfilename);
142 xDelete<char>(restartfilename);
143 xDelete<char>(rootpath);
158 this->
InitFromFiles(rootpath,inputfilename,outputfilename,toolkitsfilename,lockfilename,restartfilename,
solution_type,traceon,X);
161 #if defined(_HAVE_NEOPZ_) && !defined(_HAVE_AD_)
164 #if defined(_HAVE_BAMG_) && !defined(_HAVE_AD_)
165 this->amrbamg = NULL;
176 char *outbinfilename = NULL;
177 char *lockfilename = NULL;
179 #ifndef _HAVE_JAVASCRIPT_
186 if(outbinfilename)xDelete<char>(outbinfilename);
187 if(lockfilename)xDelete<char>(lockfilename);
207 #if defined(_HAVE_NEOPZ_) && !defined(_HAVE_AD_)
211 #if defined(_HAVE_BAMG_) && !defined(_HAVE_AD_)
212 if(amrbamg)
delete amrbamg;
234 _error_(
"Could not find index of analysis " <<
EnumToStringx(analysis_enum) <<
" in list of FemModel analyses");
240 FILE* restartfid=NULL;
241 char* restartfilename = NULL;
243 char* femmodel_buffer=NULL;
244 char* femmodel_buffer_ini=NULL;
250 restartfid=
pfopen(restartfilename,
"wb");
257 femmodel_buffer=xNew<char>(femmodel_size);
259 femmodel_buffer_ini=femmodel_buffer;
265 femmodel_buffer=femmodel_buffer_ini;
268 fwrite(femmodel_buffer,femmodel_size,
sizeof(
char),restartfid);
271 pfclose(restartfid,restartfilename);
274 xDelete<char>(femmodel_buffer);
275 xDelete<char>(restartfilename);
282 char *lockfilename = NULL;
283 bool waitonlock =
false;
318 xDelete<char>(lockfilename);
368 #if defined(_HAVE_NEOPZ_) && !defined(_HAVE_AD_)
371 #if defined(_HAVE_BAMG_) && !defined(_HAVE_AD_)
372 this->amrbamg = NULL;
386 _printf_(
" analysis_type_list: \n");
388 _printf_(
" current analysis_type: \n");
393 void FemModel::InitFromFiles(
char* rootpath,
char* inputfilename,
char* outputfilename,
char* toolkitsfilename,
char* lockfilename,
char* restartfilename,
const int in_solution_type,
bool trace,
IssmPDouble* X){
396 FILE *IOMODEL = NULL;
397 FILE *toolkitsoptionsfid = NULL;
403 if(my_rank==0) IOMODEL =
pfopen0(inputfilename ,
"rb");
406 toolkitsoptionsfid=
pfopen(toolkitsfilename,
"r");
409 this->
InitFromFids(rootpath,IOMODEL,toolkitsoptionsfid,in_solution_type,trace,X);
412 if(my_rank==0)
pfclose(IOMODEL,inputfilename);
413 pfclose(toolkitsoptionsfid,toolkitsfilename);
438 ModelProcessorx(&this->
elements,&this->
nodes_list,&this->
vertices,&this->
materials,&this->
constraints_list,&this->
loads_list,&this->
parameters,&this->
inputs2,iomodel,toolkitsoptionsfid,rootpath,this->
solution_type,this->
nummodels,this->
analysis_type_list);
464 void FemModel::Marshall(
char** pmarshalled_data,
int* pmarshalled_data_size,
int marshall_direction){
506 this->
materials->
Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
507 this->
parameters->
Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
508 this->
inputs2->
Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
509 this->
results->
Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
510 this->
vertices->
Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
511 this->
elements->
Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
516 this->
loads_list = xNew<Loads*>(this->nummodels);
518 this->
nodes_list = xNew<Nodes*>(this->nummodels);
524 this->
loads_list[i]->
Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
525 this->
nodes_list[i]->
Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
551 FILE* restartfid=NULL;
552 char* restartfilename = NULL;
555 char* femmodel_buffer=NULL;
556 char* femmodel_buffer_ini=NULL;
562 restartfid=
pfopen(restartfilename,
"r",
false);
564 if(restartfid==NULL){
565 xDelete<char>(restartfilename);
571 _printf0_(
"====================================================================\n");
574 _printf0_(
" Restart file: "<<restartfilename<<
" \n");
575 _printf0_(
"====================================================================\n");
579 fseek(restartfid, 0L, SEEK_END);
580 femmodel_size = ftell(restartfid);
581 fseek(restartfid, 0L, SEEK_SET);
584 femmodel_buffer=xNew<char>(femmodel_size);
587 fread_return=fread(femmodel_buffer,femmodel_size,
sizeof(
char),restartfid);
if(fread_return!=1)
_error_(
"error reading the buffer from marshalled file!");
588 femmodel_buffer_ini=femmodel_buffer;
594 femmodel_buffer=femmodel_buffer_ini;
597 pfclose(restartfid,restartfilename);
600 xDelete<char>(restartfilename);
601 xDelete<char>(femmodel_buffer);
643 return femmodel_size;
650 int *analyses = NULL;
653 const int MAXANALYSES = 30;
654 int analyses_temp[MAXANALYSES];
657 switch(solutiontype){
680 bool isSIA,isenthalpy;
682 iomodel->
FindConstant(&isenthalpy,
"md.thermal.isenthalpy");
701 iomodel->
FindConstant(&isenthalpy,
"md.thermal.isenthalpy");
714 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
798 bool isSIA,isFS,isthermal,isenthalpy,ismasstransport,isgroundingline,isstressbalance,ismovingfront,ishydrology,isdamage,issmb,isslr,isesa,isgia;
799 iomodel->
FindConstant(&isthermal,
"md.transient.isthermal");
800 iomodel->
FindConstant(&ismovingfront,
"md.transient.ismovingfront");
801 iomodel->
FindConstant(&ismasstransport,
"md.transient.ismasstransport");
802 iomodel->
FindConstant(&isstressbalance,
"md.transient.isstressbalance");
803 iomodel->
FindConstant(&isgroundingline,
"md.transient.isgroundingline");
804 iomodel->
FindConstant(&isdamage,
"md.transient.isdamageevolution");
805 iomodel->
FindConstant(&ishydrology,
"md.transient.ishydrology");
810 int* analyses_iter = NULL;
811 int num_analyses_iter = 0;
814 xMemCpy<int>(&analyses_temp[numanalyses],analyses_iter,num_analyses_iter);
815 numanalyses+=num_analyses_iter; xDelete<int>(analyses_iter);
819 xMemCpy<int>(&analyses_temp[numanalyses],analyses_iter,num_analyses_iter);
820 numanalyses+=num_analyses_iter; xDelete<int>(analyses_iter);
822 if(ismasstransport || isgroundingline){
824 int basalforcing_model;
825 iomodel->
FindConstant(&basalforcing_model,
"md.basalforcings.model");
828 iomodel->
FindConstant(&isplume,
"md.basalforcings.isplume");
841 xMemCpy<int>(&analyses_temp[numanalyses],analyses_iter,num_analyses_iter);
842 numanalyses+=num_analyses_iter; xDelete<int>(analyses_iter);
875 analyses=xNew<int>(numanalyses);
876 for(
int i=0;i<numanalyses;i++) analyses[i]=analyses_temp[i];
879 if(pnumanalyses) *pnumanalyses=numanalyses;
880 if(panalyses) *panalyses=analyses;
881 else xDelete<int>(analyses);
886 bool profiling =
false;
893 void (*solutioncore)(
FemModel*)=NULL;
921 _printf0_(
"\nCore solution profiling\n");
922 _printf0_(
" elapsed time : " << solution_time <<
" Seconds\n");
923 _printf0_(
" number of flops : " << solution_flops <<
" Flops\n");
924 _printf0_(
" memory used : " << solution_memory <<
" Bytes\n");
927 _printf0_(
"Individual core profiling\n");
952 _printf0_(
" elapsed time : " << solution_time <<
" Seconds\n");
953 _printf0_(
" number of flops : " << solution_flops <<
" Flops\n");
954 _printf0_(
" memory used : " << solution_memory <<
" Bytes\n");
968 IssmDouble weight,vx,vy,H,dvx[2],dvy[2],dH[2];
969 IssmDouble temp,Jdet,dhdt,groundedice_melting,surface_mass_balance;
992 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
1003 surface_mass_balance_input->
GetInputValue(&surface_mass_balance,gauss);
1004 groundedice_melting_input->
GetInputValue(&groundedice_melting,gauss);
1012 temp = vx*dH[0]+vy*dH[1]+H*(dvx[0]+dvy[1]) - (surface_mass_balance-groundedice_melting-dhdt);
1013 J +=weight*1/2*temp*temp*Jdet*gauss->
weight;
1017 xDelete<IssmDouble>(xyz_list);
1066 int *responses = NULL;
1067 Results *cost_functions = NULL;
1078 IssmDouble* Jlist = xNew<IssmDouble>(num_responses);
1079 for(
int i=0;i<num_responses;i++){
1081 Jlist[i] = reCast<IssmDouble>(result->
GetValue());
1087 delete cost_functions;
1088 xDelete<int>(responses);
1090 if(pJlist) *pJlist = Jlist;
1091 else xDelete<IssmDouble>(Jlist);
1092 if(pn) *pn = num_responses;
1125 int segcount=segments->
Size();
1126 int* allsegcount=xNew<int>(num_procs);
1131 int numseg_offset=0;
1133 for(
int i=0;i<my_rank; i++) numseg_offset+=allsegcount[i];
1134 for(
int i=0;i<num_procs;i++) numseg+=allsegcount[i];
1135 IssmDouble* segmentlist = xNewZeroInit<IssmDouble>(4*numseg);
1136 IssmDouble* allsegmentlist = xNewZeroInit<IssmDouble>(4*numseg);
1137 for(
int i=0;i<segments->
Size();i++){
1140 segmentlist[(numseg_offset+i)*4 + 0] = segment->
x[0];
1141 segmentlist[(numseg_offset+i)*4 + 1] = segment->
y[0];
1142 segmentlist[(numseg_offset+i)*4 + 2] = segment->
x[1];
1143 segmentlist[(numseg_offset+i)*4 + 3] = segment->
y[1];
1148 xDelete<IssmDouble>(segmentlist);
1149 xDelete<int>(allsegcount);
1163 dmin = pow(allsegmentlist[4*last+0] - x,2) + pow(y-allsegmentlist[4*last+1],2);
1169 for(
int i=0;i<numseg;i++){
1172 if(pow(allsegmentlist[4*i+0] - x,2)>10*dmin)
continue;
1173 if(pow(allsegmentlist[4*i+1] - y,2)>10*dmin)
continue;
1175 IssmDouble l2 = (allsegmentlist[4*i+2]-allsegmentlist[4*i+0])*(allsegmentlist[4*i+2]-allsegmentlist[4*i+0]) + (allsegmentlist[4*i+3]-allsegmentlist[4*i+1])*(allsegmentlist[4*i+3]-allsegmentlist[4*i+1]);
1179 d = (x-allsegmentlist[4*i+0])*(x-allsegmentlist[4*i+0])+(y-allsegmentlist[4*i+1])*(y-allsegmentlist[4*i+1]);
1190 IssmDouble t = ((x-allsegmentlist[4*i+0])*(allsegmentlist[4*i+2]-allsegmentlist[4*i+0]) + (y-allsegmentlist[4*i+1])*(allsegmentlist[4*i+3]-allsegmentlist[4*i+1]))/l2;
1193 d = (x-allsegmentlist[4*i+0])*(x-allsegmentlist[4*i+0])+(y-allsegmentlist[4*i+1])*(y-allsegmentlist[4*i+1]);
1197 d = (x-allsegmentlist[4*i+2])*(x-allsegmentlist[4*i+2])+(y-allsegmentlist[4*i+3])*(y-allsegmentlist[4*i+3]);
1201 xn = allsegmentlist[4*i+0] + t * (allsegmentlist[4*i+2] - allsegmentlist[4*i+0]);
1202 yn = allsegmentlist[4*i+1] + t * (allsegmentlist[4*i+3] - allsegmentlist[4*i+1]);
1203 d = (x-xn)*(x-xn)+(y-yn)*(y-yn);
1214 distances[vertex->
lid] = sqrt(dmin);
1224 xDelete<IssmDouble>(distances);
1225 xDelete<IssmDouble>(allsegmentlist);
1240 *pdiv=total_divergence;
1247 (element->*
function)();
1268 if (element->
Id()==index){
1277 if(!sumfound)
_error_(
"could not find material with id" << index <<
" to compute ElementResponse");
1280 if(my_rank==cpu_found){
1289 *presponse=response;
1305 *pV=total_floating_area;
1312 IssmDouble* uLmin_local = xNew<IssmDouble>(numnodes);
1313 IssmDouble* uLmax_local = xNew<IssmDouble>(numnodes);
1314 IssmDouble* uLmin = xNew<IssmDouble>(numnodes);
1315 IssmDouble* uLmax = xNew<IssmDouble>(numnodes);
1316 for(
int i=0;i<numnodes;i++){
1317 uLmin_local[i] = +1.e+50;
1318 uLmax_local[i] = -1.e+50;
1329 xDelete<IssmDouble>(uLmin_local);
1330 xDelete<IssmDouble>(uLmax_local);
1349 int *indices_vector_masters = NULL;
1351 vector->
GetLocalVector(&local_vector_masters,&indices_vector_masters);
1352 _assert_(localsize_masters==indices_vector_masters[localsize_masters-1] - indices_vector_masters[0]+1);
1353 xDelete<int>(indices_vector_masters);
1356 IssmDouble *local_vector = xNew<IssmDouble>(localsize);
1357 xMemCpy<IssmDouble>(local_vector,local_vector_masters,localsize_masters);
1358 xDelete<IssmDouble>(local_vector_masters);
1364 *plocal_vector = local_vector;
1379 for(
int rank=0;rank<num_procs;rank++){
1382 for(
int i=0;i<numids;i++){
1386 buffer[i] = local_vector[vertex->
lid];
1391 for(
int rank=0;rank<num_procs;rank++){
1395 for(
int i=0;i<numids;i++){
1399 local_vector[vertex->
lid] = buffer[i];
1403 xDelete<IssmDouble>(buffer);
1420 for(
int rank=0;rank<num_procs;rank++){
1423 for(
int i=0;i<numids;i++){
1427 buffer[i] = local_vector[vertex->
lid];
1432 for(
int rank=0;rank<num_procs;rank++){
1436 for(
int i=0;i<numids;i++){
1440 local_vector[vertex->
lid] += buffer[i];
1446 for(
int rank=0;rank<num_procs;rank++){
1449 for(
int i=0;i<numids;i++){
1453 buffer[i] = local_vector[vertex->
lid];
1458 for(
int rank=0;rank<num_procs;rank++){
1462 for(
int i=0;i<numids;i++){
1466 local_vector[vertex->
lid] = buffer[i];
1470 xDelete<IssmDouble>(buffer);
1484 int *indices_vector_masters = NULL;
1486 vector->
GetLocalVector(&local_vector_masters,&indices_vector_masters);
1487 _assert_(localsize_masters==indices_vector_masters[localsize_masters-1] - indices_vector_masters[0]+1);
1488 xDelete<int>(indices_vector_masters);
1491 IssmDouble *local_vector = xNew<IssmDouble>(localsize);
1492 xMemCpy<IssmDouble>(local_vector,local_vector_masters,localsize_masters);
1493 xDelete<IssmDouble>(local_vector_masters);
1501 for(
int rank=0;rank<num_procs;rank++){
1504 for(
int i=0;i<numids;i++){
1508 buffer[i] = local_vector[vertex->
lid];
1513 for(
int rank=0;rank<num_procs;rank++){
1517 for(
int i=0;i<numids;i++){
1521 local_vector[vertex->
lid] = buffer[i];
1525 xDelete<IssmDouble>(buffer);
1528 *plocal_vector = local_vector;
1543 *pV=total_grounded_area;
1548 int numvertices = 6;
1550 IssmDouble* BasinId = xNew<IssmDouble>(numvertices);
1552 IssmDouble* basin_icefront_area = xNewZeroInit<IssmDouble>(numbasins);
1554 for(
int basin=1;basin<numbasins+1;basin++){
1561 for(
int j=0;j<numvertices;j++){
1562 if(BasinId[j]==basin){
1571 basin_icefront_area[basin-1]=total_icefront_area;
1576 xDelete<IssmDouble>(basin_icefront_area);
1577 xDelete<IssmDouble>(BasinId);
1592 *pM=total_mass_flux;
1608 *pM=total_mass_flux;
1613 int numvertices = 6;
1614 IssmDouble* P1DGlist = xNew<IssmDouble>(numvertices);
1621 xDelete<IssmDouble>(P1DGlist);
1652 *pM=total_mass_flux;
1662 local_ice_mass+=element->
IceMass(scaled);
1684 *pV=total_ice_volume_af;
1694 local_ice_volume+=element->
IceVolume(scaled);
1700 *pV=total_ice_volume;
1708 bool ispresent =
false;
1714 int *mdims_array = NULL;
1715 int *ndims_array = NULL;
1721 if(!ispresent)
_error_(
"no mass flux segments available!");
1728 segments = array[counter-1];
1729 num_segments = mdims_array[counter-1];
1733 for(i=0;i<num_segments;i++){
1734 element_id=reCast<int,IssmDouble>(*(segments+5*i+4));
1737 if (element->
Id()==element_id){
1739 mass_flux+=element->
MassFlux(segments+5*i+0);
1746 mass_flux=all_mass_flux;
1751 xDelete<IssmDouble>(matrix);
1753 xDelete<int>(mdims_array);
1754 xDelete<int>(ndims_array);
1755 xDelete<IssmDouble*>(array);
1758 *pmass_flux=mass_flux;
1774 if(element_maxabsvx>maxabsvx) maxabsvx=element_maxabsvx;
1780 maxabsvx=node_maxabsvx;
1783 *pmaxabsvx=maxabsvx;
1799 if(element_maxabsvy>maxabsvy) maxabsvy=element_maxabsvy;
1805 maxabsvy=node_maxabsvy;
1808 *pmaxabsvy=maxabsvy;
1824 if(element_maxabsvz>maxabsvz) maxabsvz=element_maxabsvz;
1830 maxabsvz=node_maxabsvz;
1833 *pmaxabsvz=maxabsvz;
1845 if(fabs(local_divergence)>max_divergence) max_divergence=fabs(local_divergence);
1849 max_divergence=node_max_divergence;
1852 *pdiv=max_divergence;
1868 if(element_maxvel>maxvel) maxvel=element_maxvel;
1893 if(element_maxvx>maxvx) maxvx=element_maxvx;
1918 if(element_maxvy>maxvy) maxvy=element_maxvy;
1943 if(element_maxvz>maxvz) maxvz=element_maxvz;
1968 if(element_minvel<minvel) minvel=element_minvel;
1993 if(element_minvx<minvx) minvx=element_minvx;
2018 if(element_minvy<minvy) minvy=element_minvy;
2043 if(element_minvz<minvz) minvz=element_minvz;
2082 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
2095 J+=weight*1/2*pow(dp[0]*dp[0]+dp[1]*dp[1],2)*Jdet*gauss->
weight;
2099 xDelete<IssmDouble>(xyz_list);
2140 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
2154 J+=weight*1/2*pow(p - p0,2)*Jdet*gauss->
weight;
2158 xDelete<IssmDouble>(xyz_list);
2174 int num_controls,step;
2176 int *control_type = NULL;
2188 for(
int i=0;i<num_controls;i++){
2190 int control_enum = control_type[i];
2197 default:
_error_(
"more than 3 controls not implemented yet");
2217 xDelete<int>(control_type);
2222 bool isautodiff =
false;
2227 DataSet* dependent_objects=NULL;
2238 dependents=xNew<IssmPDouble>(num_dependents);
2240 #if defined(_HAVE_CODIPACK_)
2241 auto& tape_codi = IssmDouble::getGlobalTape();
2245 for(
int i=0;i<dependent_objects->
Size();i++){
2249 #if defined(_HAVE_CODIPACK_)
2250 tape_codi.registerOutput(output_value);
2251 dependents[i] = output_value.getValue();
2252 codi_global.output_indices.push_back(output_value.getGradientData());
2254 output_value>>=dependents[i];
2259 delete dependent_objects;
2260 if(num_dependents)xDelete<IssmPDouble>(dependents);
2262 _error_(
"Should not be requesting dependents when an AD library is not available!");
2270 bool isvec,results_on_nodes;
2271 int step,output_enum,numonnodes;
2274 const char *output_string = NULL;
2275 char** resultsonnodes = NULL;
2289 for(
int i=0;i<numoutputs;i++){
2290 output_string = requested_outputs[i];
2313 switch(output_enum){
2376 int numchannels_local=0,numchannels;
2383 IssmPDouble* values = xNewZeroInit<IssmPDouble>(numchannels);
2384 IssmPDouble* allvalues = xNew<IssmPDouble>(numchannels);
2396 xDelete<IssmPDouble>(values);
2399 xDelete<IssmPDouble>(allvalues);
2418 int interpolation,nodesperelement,size,nlines,ncols,array_size;
2419 int rank_interpolation=-1,rank_nodesperelement=-1,rank_arraysize=-1,max_rank_arraysize=0;
2425 element->
ResultInterpolation(&rank_interpolation,&rank_nodesperelement,&rank_arraysize,output_enum);
2426 if(rank_arraysize>max_rank_arraysize)max_rank_arraysize=rank_arraysize;
2428 rank_arraysize=max_rank_arraysize;
2438 results_on_nodes=
false;
2440 for(
int j=0;j<numonnodes & results_on_nodes==
false;j++){
2441 if(strcmp(resultsonnodes[j],output_string) == 0 || strcmp(resultsonnodes[j],
"all") == 0) results_on_nodes=
true;
2444 if(results_on_nodes){
2448 IssmDouble* values = xNewZeroInit<IssmDouble>(nbe*nodesperelement);
2449 IssmDouble* allvalues = xNew<IssmDouble>(nbe*nodesperelement);
2459 xDelete<IssmDouble>(values);
2462 xDelete<IssmDouble>(allvalues);
2468 switch(interpolation){
2490 delete vector_result;
2494 IssmDouble* values = xNewZeroInit<IssmDouble>(nlines*ncols);
2495 IssmDouble* allvalues = xNew<IssmDouble>(nlines*ncols);
2504 xDelete<IssmDouble>(values);
2507 xDelete<IssmDouble>(allvalues);
2518 if(!isvec && save_results){
2524 for(
int i=0;i<numonnodes;i++) xDelete<char>(resultsonnodes[i]);
2525 xDelete<char*>(resultsonnodes);
2534 char** enumlist = xNew<char*>(numoutputs);
2535 for(
int i=0;i<numoutputs;i++)
EnumToStringx(&enumlist[i],requested_outputs[i]);
2541 for(
int i=0;i<numoutputs;i++) xDelete<char>(enumlist[i]);
2542 xDelete<char*>(enumlist);
2553 int response_descriptor_enum=
StringToEnumx(response_descriptor);
2554 this->
Responsex(responses, response_descriptor_enum);
2560 switch (response_descriptor_enum){
2614 *responses=double_result;
2616 else _error_(
"response descriptor \"" <<
EnumToStringx(response_descriptor_enum) <<
"\" not supported yet!");
2690 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
2703 J+=0.5*(surface-surfaceobs)*(surface-surfaceobs)*weight*Jdet*gauss->
weight;
2706 xDelete<IssmDouble>(xyz_list);
2745 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
2757 J+=weight*1/2*(dp[0]*dp[0]+dp[1]*dp[1])*Jdet*gauss->
weight;
2761 xDelete<IssmDouble>(xyz_list);
2782 IssmDouble* H = xNew<IssmDouble>(elementswidth);
2815 for(
int i=0;i<numberofvertices;i++){
2817 Hserial[i]=Hserial[i]/totalweight[i];
2831 delete vectotalweight;
2832 xDelete<IssmDouble>(H);
2833 xDelete<IssmDouble>(Hserial);
2834 xDelete<IssmDouble>(totalweight);
2864 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
2877 J+=weight*H*H*Jdet*gauss->
weight;
2882 xDelete<IssmDouble>(xyz_list);
2910 if(dt<min_dt)min_dt=dt;
2922 if(min_dt<dt_low) min_dt = dt_low;
2923 if(min_dt>dt_high) min_dt = dt_high;
2942 *pM=total_calving_flux;
2958 *pM=total_calving_flux;
3000 local_smb+=element->
TotalSmb(scaled);
3030 int analysis_type,config_type;
3093 xDelete<IssmDouble>(bed);
3094 xDelete<IssmDouble>(surface);
3107 int *newelementslist = NULL;
3108 int newnumberofvertices = -1;
3109 int newnumberofelements = -1;
3112 int amrtype,basalforcing_model;
3113 bool isgroundingline;
3118 #if defined(_HAVE_NEOPZ_) && !defined(_HAVE_AD_)
3119 case AmrNeopzEnum: this->ReMeshNeopz(&newnumberofvertices,&newnumberofelements,&newx,&newy,&newz,&newelementslist);
break;
3122 #if defined(_HAVE_BAMG_) && !defined(_HAVE_AD_)
3123 case AmrBamgEnum: this->ReMeshBamg(&newnumberofvertices,&newnumberofelements,&newx,&newy,&newz,&newelementslist);
break;
3126 default:
_error_(
"not implemented yet");
3136 iomodel->
elements = newelementslist;
3139 bool temp;
int tempint;
3160 for(
int i=0;i<new_vertices->
Size();i++){
3162 int sid = vertex->
Sid();
3163 vertex->
x=newx[sid];
3164 vertex->
y=newy[sid];
3165 vertex->
z=newz[sid];
3169 Inputs2* new_inputs2=
new Inputs2(newnumberofelements,newnumberofvertices);
3188 new_nodes_list[i] =
new Nodes();
3193 analysis->
CreateNodes(new_nodes_list[i],iomodel,
true);
3198 new_constraints_list[i]->
Presort();
3274 this->
SetMesh(&newelementslist,&newx,&newy,&newnumberofvertices,&newnumberofelements);
3277 xDelete<IssmDouble>(newz);
3293 IssmDouble* r = xNew<IssmDouble>(numvertices);
3298 for(
int i=0;i<numvertices;i++){
3299 x = xyz_list[3*i+0];
3300 y = xyz_list[3*i+1];
3301 bx = -150.-728.8*pow(x/300000.,2)+343.91*pow(x/300000.,4)-50.57*pow(x/300000.,6);
3302 by = 500./(1.+exp((-2./4000.)*(y-80000./2.-24000.)))+500./(1.+exp((2./4000.)*(y-80000./2.+24000.)));
3303 r[i] =
max(bx+by,-720.);
3308 xDelete<IssmDouble>(xyz_list);
3311 xDelete<IssmDouble>(r);
3319 IssmDouble rho_water,rho_ice,density,base_float;
3320 IssmDouble* phi = xNew<IssmDouble>(numvertices);
3321 IssmDouble* h = xNew<IssmDouble>(numvertices);
3322 IssmDouble* s = xNew<IssmDouble>(numvertices);
3323 IssmDouble* b = xNew<IssmDouble>(numvertices);
3324 IssmDouble* r = xNew<IssmDouble>(numvertices);
3325 IssmDouble* sl = xNew<IssmDouble>(numvertices);
3335 density = rho_ice/rho_water;
3337 for(
int i=0;i<numvertices;i++){
3339 base_float = rho_ice*s[i]/(rho_ice-rho_water);
3340 if(r[i]>base_float){
3347 if(fabs(sl[i])>0)
_error_(
"Sea level value "<<sl[i]<<
" not supported!");
3350 phi[i] = h[i]+r[i]/density;
3360 xDelete<IssmDouble>(phi);
3361 xDelete<IssmDouble>(h);
3362 xDelete<IssmDouble>(s);
3363 xDelete<IssmDouble>(b);
3364 xDelete<IssmDouble>(r);
3365 xDelete<IssmDouble>(sl);
3373 int numinputs,numP0inputs,numP1inputs;
3376 int* P0input_enums = NULL;
3377 int* P0input_interp = NULL;
3380 int* P1input_enums = NULL;
3381 int* P1input_interp = NULL;
3382 int* input_interpolations = NULL;
3383 int* input_enums = NULL;
3391 for(
int step=0;step<2;step++){
3393 P0input_enums = xNew<int>(numP0inputs);
3394 P0input_interp = xNew<int>(numP0inputs);
3395 P1input_enums = xNew<int>(numP1inputs);
3396 P1input_interp = xNew<int>(numP1inputs);
3400 for(
int i=0;i<numinputs;i++){
3401 int inputinterp = input_interpolations[i];
3402 switch(inputinterp){
3408 P1input_enums[numP1inputs] = input_enums[i];
3409 P1input_interp[numP1inputs] = inputinterp;
3417 P0input_enums[numP0inputs] = input_enums[i];
3418 P0input_interp[numP0inputs] = inputinterp;
3429 pos = xNew<int>(elementswidth);
3436 for(
int j=0;j<numP0inputs;j++){
3437 switch(P0input_interp[j]){
3446 value = reCast<IssmDouble>(valueint);
3452 value = reCast<IssmDouble>(valuebool);
3458 pos[0]=element->
Sid()*numP0inputs+j;
3464 for(
int j=0;j<numP1inputs;j++){
3482 *pnumP0inputs = numP0inputs;
3483 *pP0inputs = P0inputs;
3484 *pP0input_enums = P0input_enums;
3485 *pP0input_interp = P0input_interp;
3486 *pnumP1inputs = numP1inputs;
3487 *pP1inputs = P1inputs;
3488 *pP1input_enums = P1input_enums;
3489 *pP1input_interp = P1input_interp;
3494 xDelete<int>(input_interpolations);
3495 xDelete<int>(input_enums);
3501 int numberofelements = -1;
3502 int newnumberofelements = newfemmodel_elements->
Size();
3503 int numberofvertices = -1;
3504 int newnumberofvertices = newfemmodel_vertices->
Size();
3506 int numP0inputs = -1;
3509 int* P0input_enums = NULL;
3510 int* P0input_interp = NULL;
3511 int numP1inputs = -1;
3514 int* P1input_enums = NULL;
3515 int* P1input_interp = NULL;
3520 int* elementslist = NULL;
3526 int* newelementslist = NULL;
3527 int* sidtoindex = NULL;
3530 this->
GetInputs(&numP0inputs,&P0inputs,&P0input_enums,&P0input_interp,&numP1inputs,&P1inputs,&P1input_enums,&P1input_interp);
3533 this->
GetMesh(&elementslist,&x,&y,&numberofvertices,&numberofelements);
3536 this->
GetMeshOnPartition(newfemmodel_vertices,newfemmodel_elements,&newx,&newy,&newz,&newelementslist,&sidtoindex);
3539 newxc=xNewZeroInit<IssmDouble>(newnumberofelements);
3540 newyc=xNewZeroInit<IssmDouble>(newnumberofelements);
3541 for(
int i=0;i<newnumberofelements;i++){
3542 for(
int j=0;j<elementswidth;j++){
3543 int vid = newelementslist[i*elementswidth+j]-1;
3544 newxc[i]+=newx[vid]/elementswidth;
3545 newyc[i]+=newy[vid]/elementswidth;
3551 P0inputs,numberofelements,numP0inputs,
3552 newxc,newyc,newnumberofelements,NULL);
3556 P1inputs,numberofvertices,numP1inputs,
3557 newx,newy,newnumberofvertices,NULL);
3561 values=xNew<IssmDouble>(elementswidth);
3562 for(
int i=0;i<newfemmodel_elements->
Size();i++){
3565 for(
int j=0;j<numP0inputs;j++){
3566 switch(P0input_interp[j]){
3568 element->
SetElementInput(newinputs2,P0input_enums[j],newP0inputs[i*numP0inputs+j]);
3571 element->
SetIntInput(newinputs2,P0input_enums[j],reCast<int>(newP0inputs[i*numP0inputs+j]));
3574 element->
SetBoolInput(newinputs2,P0input_enums[j],reCast<bool>(newP0inputs[i*numP0inputs+j]));
3581 for(
int i=0;i<3;i++) vertexlids[i]=element->
vertices[i]->
lid;
3582 for(
int j=0;j<numP1inputs;j++){
3583 values[0]=newP1inputs[sidtoindex[element->
vertices[0]->
Sid()]*numP1inputs+j];
3584 values[1]=newP1inputs[sidtoindex[element->
vertices[1]->
Sid()]*numP1inputs+j];
3585 values[2]=newP1inputs[sidtoindex[element->
vertices[2]->
Sid()]*numP1inputs+j];
3592 xDelete<IssmDouble>(P0inputs);
3593 xDelete<IssmDouble>(newP0inputs);
3594 xDelete<int>(P0input_enums);
3595 xDelete<int>(P0input_interp);
3596 xDelete<IssmDouble>(P1inputs);
3597 xDelete<IssmDouble>(newP1inputs);
3598 xDelete<int>(P1input_enums);
3599 xDelete<int>(P1input_interp);
3600 xDelete<IssmDouble>(newx);
3601 xDelete<IssmDouble>(newy);
3602 xDelete<IssmDouble>(newz);
3603 xDelete<IssmDouble>(newxc);
3604 xDelete<IssmDouble>(newyc);
3605 xDelete<int>(newelementslist);
3606 xDelete<int>(sidtoindex);
3607 xDelete<IssmDouble>(values);
3616 int numberofelements = -1;
3617 int numberofvertices = -1;
3621 int* elementslist = NULL;
3629 this->
GetMesh(&elementslist,&x,&y,&numberofvertices,&numberofelements);
3633 elementslist,numberofelements,this->GetElementsWidth(),step,time));
3636 x,numberofvertices,1,step,time));
3639 y,numberofvertices,1,step,time));
3645 int numberofelements = -1;
3664 stresserror,numberofelements,1,step,time));
3667 thicknesserror,numberofelements,1,step,time));
3669 xDelete<IssmDouble>(stresserror);
3670 xDelete<IssmDouble>(thicknesserror);
3679 for(
int i=0;i<newnumberofelements;i++){
3691 newtria->
nodes=NULL;
3701 int material_id=i+1;
3703 int* vertex_ids=xNew<int>(elementswidth);
3704 for(
int j=0;j<elementswidth;j++) vertex_ids[j]=reCast<int>(newelementslist[elementswidth*i+j]);
3714 xDelete<int>(vertex_ids);
3724 for(
int i=0;i<newnumberofelements;i++){
3733 if(!femmodel_vertices)
_error_(
"GetMesh: vertices are NULL.");
3734 if(!femmodel_elements)
_error_(
"GetMesh: elements are NULL.");
3742 int* elementslist = NULL;
3743 int* elem_vertices = NULL;
3752 elem_vertices = xNew<int>(elementswidth);
3758 for(
int i=0;i<femmodel_elements->
Size();i++){
3777 elementslist=xNew<int>(numberofelements*elementswidth);
3778 if(numberofelements*elementswidth<0)
_error_(
"numberofelements negative.");
3779 for(
int i=0;i<numberofelements;i++){
3780 elementslist[elementswidth*i+0] = reCast<int>(id1[i])+1;
3781 elementslist[elementswidth*i+1] = reCast<int>(id2[i])+1;
3782 elementslist[elementswidth*i+2] = reCast<int>(id3[i])+1;
3788 *pelementslist = elementslist;
3791 xDelete<int>(elem_vertices);
3792 xDelete<IssmDouble>(id1);
3793 xDelete<IssmDouble>(id2);
3794 xDelete<IssmDouble>(id3);
3795 xDelete<IssmDouble>(z);
3808 #if defined(_HAVE_NEOPZ_)
3809 case AmrNeopzEnum: this->amr->GetMesh(elementslist,x,y,numberofvertices,numberofelements);
break;
3812 #if defined(_HAVE_BAMG_)
3813 case AmrBamgEnum: this->amrbamg->GetMesh(elementslist,x,y,numberofvertices,numberofelements);
break;
3816 default:
_error_(
"not implemented yet");
3826 #if defined(_HAVE_NEOPZ_)
3827 case AmrNeopzEnum: this->amr->SetMesh(elementslist,x,y,numberofvertices,numberofelements);
break;
3830 #if defined(_HAVE_BAMG_)
3831 case AmrBamgEnum: this->amrbamg->SetMesh(elementslist,x,y,numberofvertices,numberofelements);
break;
3834 default:
_error_(
"not implemented yet");
3839 if(!femmodel_vertices)
_error_(
"GetMesh: vertices are NULL.");
3840 if(!femmodel_elements)
_error_(
"GetMesh: elements are NULL.");
3842 int numberofvertices = femmodel_vertices->
Size();
3844 int numberofelements = femmodel_elements->
Size();
3849 int* elementslist = NULL;
3850 int* sidtoindex = NULL;
3851 int* elem_vertices = NULL;
3854 sidtoindex = xNewZeroInit<int>(numbertotalofvertices);
3855 x = xNew<IssmDouble>(numberofvertices);
3856 y = xNew<IssmDouble>(numberofvertices);
3857 z = xNew<IssmDouble>(numberofvertices);
3860 for(
int i=0;i<numberofvertices;i++){
3863 x[i]=vertex->
GetX();
3864 y[i]=vertex->
GetY();
3865 z[i]=vertex->
GetZ();
3867 sidtoindex[vertex->
Sid()]=i;
3871 elem_vertices= xNew<int>(elementswidth);
3872 elementslist = xNew<int>(numberofelements*elementswidth);
3873 if(numberofelements*elementswidth<0)
_error_(
"numberofelements negative.");
3875 for(
int i=0;i<numberofelements;i++){
3878 elementslist[elementswidth*i+0] = sidtoindex[elem_vertices[0]]+1;
3879 elementslist[elementswidth*i+1] = sidtoindex[elem_vertices[1]]+1;
3880 elementslist[elementswidth*i+2] = sidtoindex[elem_vertices[2]]+1;
3887 *pelementslist = elementslist;
3888 *psidtoindex = sidtoindex;
3891 xDelete<int>(elem_vertices);
3903 int numberofcols = dofpernode*2;
3904 int numberofvertices = -1;
3905 int numberofelements = -1;
3906 int newnumberofvertices = newfemmodel_vertices->
Size();
3910 int* elementslist = NULL;
3919 this->
GetMesh(&elementslist,&x,&y,&numberofvertices,&numberofelements);
3922 newx=xNew<IssmDouble>(newnumberofvertices);
3923 newy=xNew<IssmDouble>(newnumberofvertices);
3924 for(
int i=0;i<newnumberofvertices;i++){
3927 newx[i]=vertex->
GetX();
3928 newy[i]=vertex->
GetY();
3936 SpcStatic* spcstatic = xDynamicCast<SpcStatic*>(constraint);
3937 int dof = spcstatic->
GetDof();
3940 int nodeindex = node-1;
3960 spc,numberofvertices,numberofcols,
3961 newx,newy,newnumberofvertices,NULL);
3965 for(
int i=0;i<newnumberofvertices;i++){
3968 if(!xIsNan<IssmDouble>(newspc[i*numberofcols]) && newspc[i*numberofcols+dofpernode]>(1-eps)){
3969 newfemmodel_constraints->
AddObject(
new SpcStatic(count+1,vertex->
Sid()+1,0,newspc[i*numberofcols],analysis_enum));
3975 for(
int i=0;i<newnumberofvertices;i++){
3978 if(!xIsNan<IssmDouble>(newspc[i*numberofcols+1]) && newspc[i*numberofcols+dofpernode+1]>(1-eps) ){
3979 newfemmodel_constraints->
AddObject(
new SpcStatic(count+1,vertex->
Sid()+1,1,newspc[i*numberofcols+1],analysis_enum));
3986 xDelete<IssmDouble>(spc);
3987 xDelete<IssmDouble>(newspc);
3988 xDelete<IssmDouble>(newx);
3989 xDelete<IssmDouble>(newy);
4000 for(
int iel=0;iel<newnumberofelements;iel++){
4001 if(my_elements[iel]){
4006 int* tria_node_ids=xNew<int>(numnodes);
4007 tria_node_ids[0]=newelementslist[3*iel+0];
4008 tria_node_ids[1]=newelementslist[3*iel+1];
4009 tria_node_ids[2]=newelementslist[3*iel+2];
4011 xDelete<int>(tria_node_ids);
4027 IssmDouble* deviatoricstressxx = xNew<IssmDouble>(elementswidth);
4028 IssmDouble* deviatoricstressyy = xNew<IssmDouble>(elementswidth);
4029 IssmDouble* deviatoricstressxy = xNew<IssmDouble>(elementswidth);
4030 int* elem_vertices = xNew<int>(elementswidth);
4048 Tria* triaelement = xDynamicCast<Tria*>(element);
4049 weight = triaelement->
GetArea();
4052 vectauxx->
SetValue(elem_vertices[0],weight*deviatoricstressxx[0],
ADD_VAL);
4053 vectauxx->
SetValue(elem_vertices[1],weight*deviatoricstressxx[1],
ADD_VAL);
4054 vectauxx->
SetValue(elem_vertices[2],weight*deviatoricstressxx[2],
ADD_VAL);
4056 vectauyy->
SetValue(elem_vertices[0],weight*deviatoricstressyy[0],
ADD_VAL);
4057 vectauyy->
SetValue(elem_vertices[1],weight*deviatoricstressyy[1],
ADD_VAL);
4058 vectauyy->
SetValue(elem_vertices[2],weight*deviatoricstressyy[2],
ADD_VAL);
4060 vectauxy->
SetValue(elem_vertices[0],weight*deviatoricstressxy[0],
ADD_VAL);
4061 vectauxy->
SetValue(elem_vertices[1],weight*deviatoricstressxy[1],
ADD_VAL);
4062 vectauxy->
SetValue(elem_vertices[2],weight*deviatoricstressxy[2],
ADD_VAL);
4082 for(
int i=0;i<numberofvertices;i++){
4084 tauxx[i] = tauxx[i]/totalweight[i];
4085 tauyy[i] = tauyy[i]/totalweight[i];
4086 tauxy[i] = tauxy[i]/totalweight[i];
4098 delete vectotalweight;
4099 xDelete<IssmDouble>(deviatoricstressxx);
4100 xDelete<IssmDouble>(deviatoricstressyy);
4101 xDelete<IssmDouble>(deviatoricstressxy);
4102 xDelete<IssmDouble>(totalweight);
4103 xDelete<int>(elem_vertices);
4119 IssmDouble* tauxx = xNew<IssmDouble>(numnodes);
4120 IssmDouble* tauyy = xNew<IssmDouble>(numnodes);
4121 IssmDouble* tauxy = xNew<IssmDouble>(numnodes);
4122 IssmDouble* basis = xNew<IssmDouble>(numnodes);
4123 int* elem_vertices = xNew<int>(numnodes);
4141 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
4145 ftxx=0;ftyy=0;ftxy=0;
4146 for(
int n=0;n<numnodes;n++) {
4147 ftxx+=(tauxx[n]-smoothedtauxx[elem_vertices[n]])*basis[n];
4148 ftyy+=(tauyy[n]-smoothedtauyy[elem_vertices[n]])*basis[n];
4149 ftxy+=(tauxy[n]-smoothedtauxy[elem_vertices[n]])*basis[n];
4151 error+=Jdet*gauss->
weight*( pow(ftxx,2)+pow(ftyy,2)+pow(ftxy,2) );
4155 error = sqrt(error);
4158 xDelete<IssmDouble>(xyz_list);
4169 xDelete<IssmDouble>(smoothedtauxx);
4170 xDelete<IssmDouble>(smoothedtauyy);
4171 xDelete<IssmDouble>(smoothedtauxy);
4172 xDelete<IssmDouble>(tauxx);
4173 xDelete<IssmDouble>(tauyy);
4174 xDelete<IssmDouble>(tauxy);
4175 xDelete<IssmDouble>(basis);
4176 xDelete<int>(elem_vertices);
4177 delete velementerror;
4190 IssmDouble* H = xNew<IssmDouble>(elementswidth);
4192 int* elem_vertices = xNew<int>(elementswidth);
4209 Tria* triaelement = xDynamicCast<Tria*>(element);
4210 weight = triaelement->
GetArea();
4225 xDelete<IssmDouble>(xyz_list);
4240 for(
int i=0;i<numberofvertices;i++){
4242 dHdx[i] = dHdx[i]/totalweight[i];
4243 dHdy[i] = dHdy[i]/totalweight[i];
4253 delete vectotalweight;
4254 xDelete<IssmDouble>(H);
4255 xDelete<IssmDouble>(GradH);
4256 xDelete<IssmDouble>(totalweight);
4257 xDelete<int>(elem_vertices);
4273 IssmDouble* basis = xNew<IssmDouble>(numnodes);
4274 int* elem_vertices = xNew<int>(numnodes);
4293 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
4298 for(
int n=0;n<numnodes;n++) {
4299 fdHdx+=(GradH[0]-smoothed_dHdx[elem_vertices[n]])*basis[n];
4300 fdHdy+=(GradH[1]-smoothed_dHdy[elem_vertices[n]])*basis[n];
4302 error+=Jdet*gauss->
weight*(pow(fdHdx,2)+pow(fdHdy,2) );
4306 error = sqrt(error);
4309 xDelete<IssmDouble>(xyz_list);
4321 xDelete<IssmDouble>(smoothed_dHdx);
4322 xDelete<IssmDouble>(smoothed_dHdy);
4323 xDelete<IssmDouble>(H);
4324 xDelete<IssmDouble>(GradH);
4325 xDelete<IssmDouble>(basis);
4326 xDelete<int>(elem_vertices);
4327 delete velementerror;
4334 IssmDouble* elementlevelset = xNew<IssmDouble>(elementswidth);
4340 int sid = element->
Sid();
4341 vmasklevelset->
SetValue(sid,(elementlevelset[0]+elementlevelset[1]+elementlevelset[2])/3.,
INS_VAL);
4351 xDelete<IssmDouble>(elementlevelset);
4352 delete vmasklevelset;
4360 int* elem_vertices = xNew<int>(elementswidth);
4373 int sid = element->
Sid();
4375 x1 = xyz_list[3*0+0];y1 = xyz_list[3*0+1];
4376 x2 = xyz_list[3*1+0];y2 = xyz_list[3*1+1];
4377 x3 = xyz_list[3*2+0];y3 = xyz_list[3*2+1];
4391 xDelete<IssmDouble>(x);
4392 xDelete<IssmDouble>(y);
4393 xDelete<IssmDouble>(z);
4394 xDelete<IssmDouble>(xyz_list);
4395 xDelete<int>(elem_vertices);
4405 _error_(
"level set type not implemented yet!");
4415 int* elem_vertices = xNew<int>(elementswidth);
4416 IssmDouble* levelset = xNew<IssmDouble>(elementswidth);
4430 sid= element->
Sid();
4432 x1 = xyz_list[3*0+0];y1 = xyz_list[3*0+1];
4433 x2 = xyz_list[3*1+0];y2 = xyz_list[3*1+1];
4434 x3 = xyz_list[3*2+0];y3 = xyz_list[3*2+1];
4437 Tria* tria = xDynamicCast<Tria*>(element);
4439 if(levelset[0]*levelset[1]<0. || levelset[0]*levelset[2]<0. ||
4440 abs(levelset[0]*levelset[1])<DBL_EPSILON || abs(levelset[0]*levelset[2])<DBL_EPSILON) {
4447 xDelete<IssmDouble>(xyz_list);
4457 for(
int i=0;i<numberofelements;i++) if(!xIsNan<IssmDouble>(x_zerolevelset[i])) npoints++;
4460 zerolevelset_points=xNew<IssmDouble>(2*npoints);
4462 for(
int i=0;i<numberofelements;i++){
4463 if(!xIsNan<IssmDouble>(x_zerolevelset[i])){
4464 zerolevelset_points[2*count] = x_zerolevelset[i];
4465 zerolevelset_points[2*count+1] = y_zerolevelset[i];
4471 numberofpoints = npoints;
4472 (*pzerolevelset_points) = zerolevelset_points;
4475 xDelete<int>(elem_vertices);
4476 xDelete<IssmDouble>(levelset);
4477 xDelete<IssmDouble>(x_zerolevelset);
4478 xDelete<IssmDouble>(y_zerolevelset);
4479 xDelete<IssmDouble>(xyz_list);
4480 delete vx_zerolevelset;
4481 delete vy_zerolevelset;
4486 #ifdef _HAVE_DAKOTA_
4487 void FemModel::DakotaResponsesx(
double* d_responses,
char** responses_descriptors,
int numresponsedescriptors,
int d_numresponses){
4495 double femmodel_response;
4497 double *vertex_response = NULL;
4498 double *qmu_response = NULL;
4499 double *responses_pointer = NULL;
4503 int * response_partitions_npart = NULL;
4504 int response_partitions_num;
4515 responses_pointer=d_responses;
4520 for(i=0;i<numresponsedescriptors;i++){
4530 response_partition=response_partitions[i];
4531 npart=response_partitions_npart[i];
4539 for(j=0;j<npart;j++)responses_pointer[j]=qmu_response[j];
4542 responses_pointer+=npart;
4546 xDelete<double>(vertex_response);
4547 xDelete<double>(qmu_response);
4555 this->
Responsex(&femmodel_response,root);
4559 responses_pointer[0]=femmodel_response;
4562 responses_pointer++;
4566 _error_(
"nodal response functions not supported yet!");
4569 responses_pointer++;
4574 this->
Responsex(&femmodel_response,root);
4578 responses_pointer[0]=femmodel_response;
4581 responses_pointer++;
4584 else _error_(
"flag type " << flag <<
" not supported yet for response analysis");
4589 _printf_(
" responses: " << d_numresponses <<
": ");
4590 for(i=0;i<d_numresponses-1;i++)
_printf_(d_responses[i] <<
"|");
4591 _printf_(d_responses[d_numresponses-1]);
4597 for(i=0;i<response_partitions_num;i++){
4599 xDelete<IssmDouble>(matrix);
4601 xDelete<IssmDouble*>(response_partitions);
4612 element->GiaDeflection(wg,dwgdt, x,y);
4630 for(
int i=0;i<nsmax;i++){
4633 element->EsaGeodetic2D(pUp,pNorth,pEast,pX,pY,xx,yy);
4652 xDelete<IssmDouble>(xx);
4653 xDelete<IssmDouble>(yy);
4668 for(
int i=0;i<nsmax;i++){
4671 element->EsaGeodetic3D(pUp,pNorth,pEast,latitude,longitude,radius,xx,yy,zz);
4686 xDelete<IssmDouble>(latitude);
4687 xDelete<IssmDouble>(longitude);
4688 xDelete<IssmDouble>(radius);
4689 xDelete<IssmDouble>(xx);
4690 xDelete<IssmDouble>(yy);
4691 xDelete<IssmDouble>(zz);
4695 #ifdef _HAVE_SEALEVELRISE_
4709 IssmDouble* RSLgi=xNewZeroInit<IssmDouble>(gsize);
4710 int* indices=xNew<int>(gsize);
4711 for(
int i=0;i<gsize;i++) indices[i]=i;
4717 if (masks->
isoceanin[i]) oceanarea_cpu += area;
4726 element->SealevelriseEustatic(RSLgi,&eustatic_cpu_e,masks, oceanarea);
4727 eustatic_cpu+=eustatic_cpu_e;
4737 _assert_(!xIsNan<IssmDouble>(eustatic));
4740 xDelete<int>(indices);
4741 xDelete<IssmDouble>(RSLgi);
4744 *poceanarea = oceanarea;
4745 *peustatic = eustatic;
4755 int* indices = NULL;
4758 bool computerigid =
true;
4759 bool computeelastic=
true;
4768 RSLgo=xNewZeroInit<IssmDouble>(gsize);
4769 indices=xNew<int>(gsize);
for (
int i=0;i<gsize;i++)indices[i]=i;
4775 if(computerigid | computeelastic){
4778 element->SealevelriseNonEustatic(RSLgo,RSLg_old,masks);
4785 xDelete<int>(indices);
4786 xDelete<IssmDouble>(RSLgo);
4787 xDelete<IssmDouble>(RSLg_old);
4794 bool spherical=
true;
4814 element->SealevelriseMomentOfInertia(&moi_list[0],RSLg_old,masks );
4815 moi_list_cpu[0] += moi_list[0];
4816 moi_list_cpu[1] += moi_list[1];
4817 moi_list_cpu[2] += moi_list[2];
4838 m1 = 1/(1-tide_love_k[2]/tide_love_k2secular) * (1+load_love_k[2])/(moi_p-moi_e) * moi_list[0];
4839 m2 = 1/(1-tide_love_k[2]/tide_love_k2secular) * (1+load_love_k[2])/(moi_p-moi_e) * moi_list[1];
4840 m3 = -(1+load_love_k[2])/moi_p * moi_list[2];
4856 lati=latitude[sid]/180*
PI; longi=longitude[sid]/180*
PI; radi=radius[sid];
4859 value=((1.0+tide_love_k[2]-tide_love_h[2])/9.81)*pow(omega*radi,2.0)*
4860 (-m3/6.0 + 0.5*m3*cos(2.0*lati) - 0.5*sin(2.*lati)*(m1*cos(longi)+m2*sin(longi)));
4869 if(pIxz)*pIxz=moi_list[0];
4870 if(pIyz)*pIyz=moi_list[1];
4871 if(pIzz)*pIzz=moi_list[2];
4872 xDelete<IssmDouble>(latitude);
4873 xDelete<IssmDouble>(longitude);
4874 xDelete<IssmDouble>(tide_love_h);
4875 xDelete<IssmDouble>(tide_love_k);
4876 xDelete<IssmDouble>(load_love_k);
4878 xDelete<IssmDouble>(radius);
4881 xDelete<IssmDouble>(RSLg_old);
4893 int* indices = NULL;
4906 Up=xNewZeroInit<IssmDouble>(gsize);
4908 North=xNewZeroInit<IssmDouble>(gsize);
4909 East=xNewZeroInit<IssmDouble>(gsize);
4911 indices=xNew<int>(gsize);
for (
int i=0;i<gsize;i++)indices[i]=i;
4916 element->SealevelriseGeodetic(Up,North,East,RSLg,masks);
4929 xDelete<IssmDouble>(Up);
4931 xDelete<IssmDouble>(North);
4932 xDelete<IssmDouble>(East);
4934 xDelete<int>(indices);
4935 xDelete<IssmDouble>(RSLg);
4952 oceanvalue_cpu += element->OceanAverage(RSLg_serial,masks);
4959 xDelete<IssmDouble>(RSLg_serial);
4961 return oceanvalue/oceanarea;
4974 int *eplzigzag_counter = NULL;
4998 if(serial_rec[node->
Sid()]==1.)eplzigzag_counter[node->
Lid()] ++;
4999 if(eplzigzag_counter[node->
Lid()]>eplflip_lock && eplflip_lock!=0){
5008 xDelete<int>(eplzigzag_counter);
5009 xDelete<IssmDouble>(serial_rec);
5010 xDelete<IssmDouble>(old_active);
5016 xDelete<IssmDouble>(serial_mask);
5036 IssmDouble *base = xNew<IssmDouble>(numnodes);
5038 for(
int in=0;in<numnodes;in++){
5040 if(serial_active[node->
Sid()]==1.){
5042 if(!node->
IsClone()) counter++;
5049 xDelete<IssmDouble>(base);
5051 xDelete<IssmDouble>(serial_active);
5053 delete inefanalysis;
5057 counter=sum_counter;
5058 *pEplcount = counter;
5061 _printf0_(
" No nodes are active in EPL layer \n");
5064 _printf0_(
" Some active nodes in EPL layer \n");
5103 xDelete<IssmDouble>(serial_mask);
5123 IssmDouble *base = xNew<IssmDouble>(numnodes);
5127 for(
int in=0;in<numnodes;in++){
5129 if(serial_active[node->
Sid()]==1.){
5131 if(!node->
IsClone()) counter++;
5138 xDelete<IssmDouble>(base);
5140 xDelete<IssmDouble>(serial_active);
5141 delete inefanalysis;
5145 counter=sum_counter;
5146 *pIDScount = counter;
5149 _printf0_(
" No nodes are active in IDS layer \n");
5152 _printf0_(
" Some active nodes in IDS layer \n");
5185 if(serial_active[node->
Sid()]==1.){
5187 if(!node->
IsClone()) counter++;
5193 xDelete<IssmDouble>(serial_active);
5197 counter=sum_counter;
5198 *pL2count = counter;
5204 for(
int i=0;i<numoutputs;i++){
5215 for(
int i=0;i<numoutputs;i++){
5216 if(input_enum[i]<0){
5217 _error_(
"Can't deal with non enum fields for result Stack");
5228 IssmDouble* values=xNew<IssmDouble>(numvertices);
5229 int *vertexlids = xNew<int>(numvertices);
5237 default:
_error_(
"Not implemented yet");
5239 xDelete<IssmDouble>(values);
5240 xDelete<int>(vertexlids);
5248 for(
int i=0;i<numoutputs;i++){
5251 element->
CreateInputTimeAverage(transientinput_enum[i],averagedinput_enum[i],init_time,end_time,averaging_method);
5255 #ifdef _HAVE_JAVASCRIPT_
5273 this->InitFromBuffers((
char*)buffer,buffersize,toolkits,
solution_type,trace,NULL);
5281 void FemModel::CleanUpJs(
char** poutput,
size_t* psize){
5287 char** poutputbuffer;
5288 size_t* poutputbuffersize;
5310 *poutput=*poutputbuffer;
5311 *psize=*poutputbuffersize;
5314 void FemModel::InitFromBuffers(
char* buffer,
int buffersize,
char* toolkits,
int in_solution_type,
bool trace,
IssmPDouble* X){
5317 FILE *IOMODEL = NULL;
5318 FILE *toolkitsoptionsfid = NULL;
5319 FILE *output_fid = NULL;
5323 const char *rootpath =
"";
5329 if(my_rank==0) IOMODEL = fmemopen((
void*)buffer, buffersize,
"rb");
5332 toolkitsoptionsfid=fmemopen((
void*)toolkits, strlen(toolkits)+1,
"r");
5335 this->
InitFromFids((
char*)rootpath,IOMODEL,toolkitsoptionsfid,in_solution_type,trace,X);
5338 if(my_rank==0) fclose(IOMODEL);
5339 fclose(toolkitsoptionsfid);
5342 output_fid=open_memstream(&outputbuffer,&outputsize);
5343 if(output_fid==NULL)
_error_(
"could not initialize output stream");
5351 #if defined(_HAVE_BAMG_) && !defined(_HAVE_AD_)
5352 void FemModel::ReMeshBamg(
int* pnewnumberofvertices,
int* pnewnumberofelements,
IssmDouble** pnewx,
IssmDouble** pnewy,
IssmDouble** pnewz,
int** pnewelementslist){
5359 int *newelementslist = NULL;
5360 int* newdatalist = NULL;
5361 int newnumberofvertices = -1;
5362 int newnumberofelements = -1;
5374 if(this->amrbamg->fieldenum!=
NoneEnum){
5381 if(this->amrbamg->groundingline_distance>0||this->amrbamg->icefront_distance>0||
5382 this->amrbamg->thicknesserror_threshold>0||this->amrbamg->deviatoricerror_threshold>0){
5384 hmaxvertices_serial=xNew<IssmDouble>(numberofvertices);
5385 for(
int i=0;i<numberofvertices;i++) hmaxvertices_serial[i]=NAN;
5387 if(this->amrbamg->thicknesserror_threshold>0) this->GethmaxVerticesFromEstimators(hmaxvertices_serial,
ThicknessErrorEstimatorEnum);
5389 if(this->amrbamg->groundingline_distance>0) this->GethmaxVerticesFromZeroLevelSetDistance(hmaxvertices_serial,
MaskOceanLevelsetEnum);
5390 if(this->amrbamg->icefront_distance>0) this->GethmaxVerticesFromZeroLevelSetDistance(hmaxvertices_serial,
MaskIceLevelsetEnum);
5394 this->amrbamg->ExecuteRefinementBamg(vector_serial,hmaxvertices_serial,&newdatalist,&newxylist,&newelementslist);
5395 if(newdatalist[0]<=0 || newdatalist[1]<=0)
_error_(
"Error in the refinement process.");
5399 if(my_rank) newdatalist=xNew<int>(2);
5401 newnumberofvertices=newdatalist[0];
5402 newnumberofelements=newdatalist[1];
5404 newxylist =xNew<IssmDouble>(newnumberofvertices*2);
5411 newx=xNew<IssmDouble>(newnumberofvertices);
5412 newy=xNew<IssmDouble>(newnumberofvertices);
5413 newz=xNewZeroInit<IssmDouble>(newnumberofvertices);
5414 for(
int i=0;i<newnumberofvertices;i++){
5415 newx[i] = newxylist[2*i];
5416 newy[i] = newxylist[2*i+1];
5420 *pnewnumberofvertices = newnumberofvertices;
5421 *pnewnumberofelements = newnumberofelements;
5425 *pnewelementslist = newelementslist;
5428 xDelete<int>(newdatalist);
5429 xDelete<IssmDouble>(newxylist);
5430 xDelete<IssmDouble>(vector_serial);
5431 xDelete<IssmDouble>(hmaxvertices_serial);
5435 void FemModel::InitializeAdaptiveRefinementBamg(
void){
5449 this->amrbamg = NULL;
5455 this->amrbamg =
new AmrBamg();
5477 this->amrbamg->SetBamgOpts(hmin,hmax,err,gradation);
5480 this->amrbamg->SetMesh(&
elements,&x,&y,&numberofvertices,&numberofelements);
5482 this->amrbamg->Initialize();
5486 void FemModel::GethmaxVerticesFromZeroLevelSetDistance(
IssmDouble* hmaxvertices,
int levelset_type){
5488 if(!hmaxvertices)
_error_(
"hmaxvertices is NULL!\n");
5498 int sid,numberofpoints;
5500 switch(levelset_type){
5502 threshold = this->amrbamg->groundingline_distance;
5503 resolution = this->amrbamg->groundingline_resolution;
5506 threshold = this->amrbamg->icefront_distance;
5507 resolution = this->amrbamg->icefront_resolution;
5509 default:
_error_(
"not implemented yet");
5521 minvertexdistance=INFINITY;
5524 for(
int j=0;j<numberofpoints;j++){
5525 distance=sqrt((x-levelset_points[2*j])*(x-levelset_points[2*j])+(y-levelset_points[2*j+1])*(y-levelset_points[2*j+1]));
5526 minvertexdistance=
min(distance,minvertexdistance);
5535 pminvertexdistance=vminvertexdistance->
ToMPISerial();
5538 for(
int i=0;i<numberofvertices;i++){
5539 if(pminvertexdistance[i]<threshold){
5540 if(xIsNan<IssmDouble>(hmaxvertices[i])) hmaxvertices[i]=resolution;
5541 else hmaxvertices[i]=
min(resolution,hmaxvertices[i]);
5546 xDelete<IssmDouble>(pminvertexdistance);
5547 xDelete<IssmDouble>(levelset_points);
5548 delete vminvertexdistance;
5551 void FemModel::GethmaxVerticesFromEstimators(
IssmDouble* hmaxvertices,
int errorestimator_type){
5553 if(!hmaxvertices)
_error_(
"hmaxvertices is NULL!\n");
5557 int numberofelements = -1;
5558 int numberofvertices = -1;
5559 IssmDouble hmax = this->amrbamg->GetBamgOpts()->hmax;
5566 IssmDouble maxerror,threshold,groupthreshold,resolution,length;
5573 switch(errorestimator_type){
5575 threshold = this->amrbamg->thicknesserror_threshold;
5576 groupthreshold = this->amrbamg->thicknesserror_groupthreshold;
5577 resolution = this->amrbamg->thicknesserror_resolution;
5578 maxerror = this->amrbamg->thicknesserror_maximum;
5582 threshold = this->amrbamg->deviatoricerror_threshold;
5583 groupthreshold = this->amrbamg->deviatoricerror_groupthreshold;
5584 resolution = this->amrbamg->deviatoricerror_resolution;
5585 maxerror = this->amrbamg->deviatoricerror_maximum;
5588 default:
_error_(
"not implemented yet");
5590 if(!error_elements)
_error_(
"error_elements is NULL!\n");
5591 if(groupthreshold<DBL_EPSILON)
_error_(
"group threshold is too small!");
5594 this->
GetMesh(&index,&x,&y,&numberofvertices,&numberofelements);
5595 if(numberofelements<0)
_error_(
"number of elements is negative!\n");
5596 if(numberofvertices<0)
_error_(
"number of vertices is negative!\n");
5597 maxlength = xNew<IssmDouble>(numberofelements);
5598 error_vertices = xNewZeroInit<IssmDouble>(numberofvertices);
5601 if(maxerror<DBL_EPSILON){
5602 for(
int i=0;i<numberofelements;i++) maxerror=
max(maxerror,error_elements[i]);
5603 switch(errorestimator_type){
5610 for(
int i=0;i<numberofelements;i++){
5611 v1=index[i*elementswidth+0]-1;
5612 v2=index[i*elementswidth+1]-1;
5613 v3=index[i*elementswidth+2]-1;
5614 L1=sqrt(pow(x[v2]-x[v1],2)+pow(y[v2]-y[v1],2));
5615 L2=sqrt(pow(x[v3]-x[v2],2)+pow(y[v3]-y[v2],2));
5616 L3=sqrt(pow(x[v1]-x[v3],2)+pow(y[v1]-y[v3],2));
5618 maxlength[i] =
max(L1,
max(L2,L3));
5619 error_vertices[v1]+=error_elements[i];
5620 error_vertices[v2]+=error_elements[i];
5621 error_vertices[v3]+=error_elements[i];
5625 for(
int i=0;i<numberofelements;i++){
5627 if(error_elements[i]>threshold*maxerror){
5629 for(
int j=0;j<elementswidth;j++){
5630 vid=index[i*elementswidth+j]-1;
5631 if(xIsNan<IssmDouble>(hmaxvertices[vid])) hmaxvertices[vid]=
max(maxlength[i]/2.,resolution);
5632 else hmaxvertices[vid]=
min(
max(maxlength[i]/2.,resolution),hmaxvertices[vid]);
5637 if(maxlength[i] < 1.1*hmax/2.){
5638 for(
int j=0;j<elementswidth;j++){
5639 vid=index[i*elementswidth+j]-1;
5640 if(error_vertices[vid]>groupthreshold*maxerror) hmaxvertices[vid]=maxlength[i];
5642 if(xIsNan<IssmDouble>(hmaxvertices[vid])) hmaxvertices[vid]=
min(maxlength[i]*2.,hmax);
5643 else hmaxvertices[vid]=
min(
min(maxlength[i]*2.,hmax),hmaxvertices[vid]);
5651 xDelete<IssmDouble>(error_elements);
5652 xDelete<IssmDouble>(error_vertices);
5653 xDelete<IssmDouble>(maxlength);
5656 void FemModel::GetVerticeDistanceToZeroLevelSet(
IssmDouble** pverticedistance,
int levelset_type){
5664 _error_(
"level set type not implemented yet!");
5671 int numberofvertices = -1;
5672 int numberofelements = -1;
5676 int* elementslist = NULL;
5681 this->
GetMesh(&elementslist,&x,&y,&numberofvertices,&numberofelements);
5688 verticedistance=xNew<IssmDouble>(numberofvertices);
5689 for(
int i=0;i<numberofvertices;i++){
5690 verticedistance[i]=INFINITY;
5691 for(
int j=0;j<numberofpoints;j++){
5692 distance=sqrt((x[i]-levelset_points[2*j])*(x[i]-levelset_points[2*j])+(y[i]-levelset_points[2*j+1])*(y[i]-levelset_points[2*j+1]));
5693 verticedistance[i]=
min(distance,verticedistance[i]);
5698 (*pverticedistance)=verticedistance;
5701 xDelete<IssmDouble>(levelset_points);
5706 #if defined(_HAVE_NEOPZ_) && !defined(_HAVE_AD_)
5707 void FemModel::ReMeshNeopz(
int* pnewnumberofvertices,
int* pnewnumberofelements,
IssmDouble** pnewx,
IssmDouble** pnewy,
IssmDouble** pnewz,
int** pnewelementslist){
5719 int* newelementslist = NULL;
5720 int* newdatalist = NULL;
5721 int newnumberofvertices = -1;
5722 int newnumberofelements = -1;
5725 if(this->amr->groundingline_distance>0) this->GetElementDistanceToZeroLevelSet(&gl_distance,
MaskOceanLevelsetEnum);
5726 if(this->amr->icefront_distance>0) this->GetElementDistanceToZeroLevelSet(&if_distance,
MaskIceLevelsetEnum);
5728 if(this->amr->deviatoricerror_threshold>0) this->
ZZErrorEstimator(&deviatoricerror);
5731 this->amr->ExecuteRefinement(gl_distance,if_distance,deviatoricerror,thicknesserror,
5732 &newdatalist,&newxylist,&newelementslist);
5733 if(newdatalist[0]<=0 || newdatalist[1]<=0)
_error_(
"Error in the ReMeshNeopz.");
5737 if(my_rank) newdatalist=xNew<int>(2);
5739 newnumberofvertices=newdatalist[0];
5740 newnumberofelements=newdatalist[1];
5742 newxylist =xNew<IssmDouble>(newnumberofvertices*2);
5749 newx=xNew<IssmDouble>(newnumberofvertices);
5750 newy=xNew<IssmDouble>(newnumberofvertices);
5751 newz=xNewZeroInit<IssmDouble>(newnumberofvertices);
5752 for(
int i=0;i<newnumberofvertices;i++){
5753 newx[i] = newxylist[2*i];
5754 newy[i] = newxylist[2*i+1];
5758 (*pnewelementslist) = newelementslist;
5762 *pnewnumberofvertices= newnumberofvertices;
5763 *pnewnumberofelements= newnumberofelements;
5766 xDelete<int>(newdatalist);
5767 xDelete<IssmDouble>(newxylist);
5768 xDelete<IssmDouble>(deviatoricerror);
5769 xDelete<IssmDouble>(thicknesserror);
5770 xDelete<IssmDouble>(gl_distance);
5771 xDelete<IssmDouble>(if_distance);
5774 void FemModel::InitializeAdaptiveRefinementNeopz(
void){
5779 int numberofelements = this->elements->NumberOfElements();
5795 this->SetRefPatterns();
5797 this->amr->refinement_type=1;
5812 this->amr->SetMesh(&
elements,&x,&y,&numberofvertices,&numberofelements);
5816 this->amr->ReadMesh();
5818 this->amr->Initialize();
5823 void FemModel::GetElementDistanceToZeroLevelSet(
IssmDouble** pelementdistance,
int levelset_type){
5828 _error_(
"level set type not implemented yet!");
5835 int numberofelements = this->elements->NumberOfElements();
5846 for(
int i=0;i<this->elements->Size();i++){
5847 Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
5848 int sid = element->
Sid();
5850 x1 = xyz_list[3*0+0];y1 = xyz_list[3*0+1];
5851 x2 = xyz_list[3*1+0];y2 = xyz_list[3*1+1];
5852 x3 = xyz_list[3*2+0];y3 = xyz_list[3*2+1];
5855 mindistance=INFINITY;
5857 for(
int j=0;j<numberofpoints;j++){
5858 distance =sqrt((xc-levelset_points[2*j])*(xc-levelset_points[2*j])+(yc-levelset_points[2*j+1])*(yc-levelset_points[2*j+1]));
5859 mindistance=
min(distance,mindistance);
5862 xDelete<IssmDouble>(xyz_list);
5869 (*pelementdistance)=velementdistance->
ToMPISerial();
5872 xDelete<IssmDouble>(levelset_points);
5873 xDelete<IssmDouble>(xyz_list);
5874 delete velementdistance;
5877 void FemModel::SetRefPatterns(){
5880 gRefDBase.InitializeUniformRefPattern(ETriangle);
5883 std::string filepath = REFPATTERNDIR;
5884 std::string filename1 = filepath +
"/2D_Triang_Rib_3.rpt";
5885 std::string filename2 = filepath +
"/2D_Triang_Rib_4.rpt";
5886 std::string filename3 = filepath +
"/2D_Triang_Rib_5.rpt";
5887 std::string filename4 = filepath +
"/2D_Triang_Rib_OnlyTriang_Side_3_4.rpt";
5888 std::string filename5 = filepath +
"/2D_Triang_Rib_OnlyTriang_Side_3_4_permuted.rpt";
5889 std::string filename6 = filepath +
"/2D_Triang_Rib_OnlyTriang_Side_3_5.rpt";
5890 std::string filename7 = filepath +
"/2D_Triang_Rib_OnlyTriang_Side_3_5_permuted.rpt";
5891 std::string filename8 = filepath +
"/2D_Triang_Rib_OnlyTriang_Side_4_5.rpt";
5892 std::string filename9 = filepath +
"/2D_Triang_Rib_OnlyTriang_Side_4_5_permuted.rpt";
5894 TPZAutoPointer<TPZRefPattern> refpat1 =
new TPZRefPattern(filename1);
5895 TPZAutoPointer<TPZRefPattern> refpat2 =
new TPZRefPattern(filename2);
5896 TPZAutoPointer<TPZRefPattern> refpat3 =
new TPZRefPattern(filename3);
5897 TPZAutoPointer<TPZRefPattern> refpat4 =
new TPZRefPattern(filename4);
5898 TPZAutoPointer<TPZRefPattern> refpat5 =
new TPZRefPattern(filename5);
5899 TPZAutoPointer<TPZRefPattern> refpat6 =
new TPZRefPattern(filename6);
5900 TPZAutoPointer<TPZRefPattern> refpat7 =
new TPZRefPattern(filename7);
5901 TPZAutoPointer<TPZRefPattern> refpat8 =
new TPZRefPattern(filename8);
5902 TPZAutoPointer<TPZRefPattern> refpat9 =
new TPZRefPattern(filename9);
5904 if(!gRefDBase.FindRefPattern(refpat1)) gRefDBase.InsertRefPattern(refpat1);
5905 if(!gRefDBase.FindRefPattern(refpat2)) gRefDBase.InsertRefPattern(refpat2);
5906 if(!gRefDBase.FindRefPattern(refpat3)) gRefDBase.InsertRefPattern(refpat3);
5907 if(!gRefDBase.FindRefPattern(refpat4)) gRefDBase.InsertRefPattern(refpat4);
5908 if(!gRefDBase.FindRefPattern(refpat5)) gRefDBase.InsertRefPattern(refpat5);
5909 if(!gRefDBase.FindRefPattern(refpat6)) gRefDBase.InsertRefPattern(refpat6);
5910 if(!gRefDBase.FindRefPattern(refpat7)) gRefDBase.InsertRefPattern(refpat7);
5911 if(!gRefDBase.FindRefPattern(refpat8)) gRefDBase.InsertRefPattern(refpat8);
5912 if(!gRefDBase.FindRefPattern(refpat9)) gRefDBase.InsertRefPattern(refpat9);