56 int i,j,elementnbv,numfacevertices;
60 bool spcpresent =
false;
64 bool *boundaryedge = NULL;
66 switch(finite_element){
72 case TriaEnum: elementnbv = 3;
break;
75 default:
_error_(
"mesh type not supported yet");
101 case TriaEnum: elementnbv = 3;
break;
104 default:
_error_(
"mesh type not supported yet");
117 switch(finite_element){
121 if (!xIsNan<IssmDouble>(spcdata[i])){
131 if (!xIsNan<IssmDouble>(spcdata[i])){
138 if(iomodel->
my_edges[i] && boundaryedge[i]){
139 v1 = iomodel->
edges[3*i+0]-1;
140 v2 = iomodel->
edges[3*i+1]-1;
141 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){
143 dof,(spcdata[v1]+spcdata[v2])/2.,analysis_type));
152 for(j=0;j<4;j++) value += spcdata[iomodel->
verticalfaces[i*4+j] -1]/4.;
153 if(!xIsNan<IssmDouble>(value)){
164 if (!xIsNan<IssmDouble>(spcdata[i])){
171 if(iomodel->
my_edges[i] && boundaryedge[i]){
172 v1 = iomodel->
edges[3*i+0]-1;
173 v2 = iomodel->
edges[3*i+1]-1;
174 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){
176 dof,(spcdata[v1]+spcdata[v2])/2.,analysis_type));
187 for(j=0;j<numfacevertices;j++){
190 value = value/reCast<IssmDouble>(numfacevertices);
191 if(!xIsNan<IssmDouble>(value)){
194 dof,value,analysis_type));
203 value = spcdata[iomodel->
elements[i*elementnbv+0]-1];
204 for(j=1;j<elementnbv;j++) value += spcdata[iomodel->
elements[i*elementnbv+j]-1];
205 value = value/reCast<IssmDouble,int>(elementnbv+0);
206 if(!xIsNan<IssmDouble>(value)){
220 if (!xIsNan<IssmDouble>(spcdata[i])){
228 v1 = iomodel->
edges[3*i+0]-1;
229 v2 = iomodel->
edges[3*i+1]-1;
230 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){
232 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type));
241 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){
244 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type));
246 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type));
254 for(j=0;j<4;j++) value += spcdata[iomodel->
verticalfaces[i*4+j]-1]/4.;
255 if(!xIsNan<IssmDouble>(value)){
258 dof,value,analysis_type));
261 dof,value,analysis_type));
264 dof,value,analysis_type));
273 if (!xIsNan<IssmDouble>(spcdata[i])){
281 value = spcdata[iomodel->
elements[i*elementnbv+0]-1];
282 for(j=1;j<elementnbv;j++) value += spcdata[iomodel->
elements[i*elementnbv+j]-1];
283 value = value/reCast<IssmDouble,int>(elementnbv+0);
284 if(!xIsNan<IssmDouble>(value)){
286 dof,value,analysis_type));
295 if (!xIsNan<IssmDouble>(spcdata[i])){
305 if (!xIsNan<IssmDouble>(spcdata[i])){
315 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){
325 if (!xIsNan<IssmDouble>(spcdata[i])){
335 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){
337 dof,2./3.*spcdata[v1]+1./3.*spcdata[v2],analysis_type));
339 dof,1./3.*spcdata[v1]+2./3.*spcdata[v2],analysis_type));
348 if (!xIsNan<IssmDouble>(spcdata[i])){
358 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){
360 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type));
362 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type));
364 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type));
373 if (!xIsNan<IssmDouble>(spcdata[i])){
383 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){
399 times=xNew<IssmDouble>(N);
400 for(j=0;j<N;j++) times[j]=spcdata[(M-1)*N+j];
402 switch(finite_element){
408 values=xNew<IssmDouble>(N);
411 values[j]=spcdata[i*N+j];
412 if(!xIsNan<IssmDouble>(values[j]))spcpresent=
true;
419 xDelete<IssmDouble>(values);
428 values=xNew<IssmDouble>(N);
431 values[j]=spcdata[i*N+j];
432 if(!xIsNan<IssmDouble>(values[j]))spcpresent=
true;
440 xDelete<IssmDouble>(values);
445 v1 = iomodel->
edges[3*i+0]-1;
446 v2 = iomodel->
edges[3*i+1]-1;
447 values=xNew<IssmDouble>(N);
450 values[j]=(spcdata[v1*N+j]+spcdata[v2*N+j])/2.;
451 if(!xIsNan<IssmDouble>(values[j])) spcpresent=
true;
457 xDelete<IssmDouble>(values);
466 values=xNew<IssmDouble>(N);
469 values[j]=spcdata[i*N+j];
470 if(!xIsNan<IssmDouble>(values[j]))spcpresent=
true;
477 xDelete<IssmDouble>(values);
484 values=xNew<IssmDouble>(N);
487 values[j]=(spcdata[v1*N+j]+spcdata[v2*N+j])/2.;
488 if(!xIsNan<IssmDouble>(values[j])) spcpresent=
true;
494 xDelete<IssmDouble>(values);
503 values=xNew<IssmDouble>(N);
506 values[j]=spcdata[i*N+j];
507 if(!xIsNan<IssmDouble>(values[j]))spcpresent=
true;
514 xDelete<IssmDouble>(values);
521 values=xNew<IssmDouble>(N);
524 values[j]=2./3.*spcdata[v1*N+j]+1./3.*spcdata[v2*N+j];
525 if(!xIsNan<IssmDouble>(values[j])) spcpresent=
true;
533 values[j]=1./3.*spcdata[v1*N+j]+2./3.*spcdata[v2*N+j];
534 if(!xIsNan<IssmDouble>(values[j])) spcpresent=
true;
540 xDelete<IssmDouble>(values);
549 values=xNew<IssmDouble>(N);
552 values[j]=spcdata[i*N+j];
553 if(!xIsNan<IssmDouble>(values[j]))spcpresent=
true;
560 xDelete<IssmDouble>(values);
564 if(iomodel->
edges[i*3+2]!=2){
566 v1 = iomodel->
edges[3*i+0]-1;
567 v2 = iomodel->
edges[3*i+1]-1;
568 values=xNew<IssmDouble>(N);
571 values[j]=(spcdata[v1*N+j]+spcdata[v2*N+j])/2.;
572 if(!xIsNan<IssmDouble>(values[j])) spcpresent=
true;
578 xDelete<IssmDouble>(values);
588 _error_(
"Size of spc field not supported");
592 xDelete<IssmDouble>(times);
593 xDelete<IssmDouble>(values);
594 xDelete<bool>(boundaryedge);