10 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
14 #include "../classes.h"
33 int pos1,pos2,pos3,pos4;
37 int numericalflux_elem_ids[2];
38 int numericalflux_vertex_ids[2];
39 int numericalflux_node_ids[4];
40 int numericalflux_type;
41 int numericalflux_degree;
44 int i1 = iomodel->
faces[4*index+0];
45 int i2 = iomodel->
faces[4*index+1];
46 int e1 = iomodel->
faces[4*index+2];
47 int e2 = iomodel->
faces[4*index+3];
53 numericalflux_elem_ids[0]=e1;
58 numericalflux_elem_ids[0]=e1;
59 numericalflux_elem_ids[1]=e2;
67 numericalflux_vertex_ids[0]=i1;
68 numericalflux_vertex_ids[1]=i2;
73 pos1=pos2=pos3=pos4=
UNDEF;
75 if(iomodel->
elements[3*(e1-1)+j]==i1) pos1=j+1;
76 if(iomodel->
elements[3*(e1-1)+j]==i2) pos2=j+1;
77 if(iomodel->
elements[3*(e2-1)+j]==i1) pos3=j+1;
78 if(iomodel->
elements[3*(e2-1)+j]==i2) pos4=j+1;
84 numericalflux_node_ids[0]=3*(e1-1)+pos1;
85 numericalflux_node_ids[1]=3*(e1-1)+pos2;
86 numericalflux_node_ids[2]=3*(e2-1)+pos3;
87 numericalflux_node_ids[3]=3*(e2-1)+pos4;
93 if(iomodel->
elements[3*(e1-1)+j]==i1) pos1=j+1;
94 if(iomodel->
elements[3*(e1-1)+j]==i2) pos2=j+1;
100 numericalflux_node_ids[0]=3*(e1-1)+pos1;
101 numericalflux_node_ids[1]=3*(e1-1)+pos2;
108 for(
int i=0;i<numnodes;i++) numericalflux_node_ids[i] = numericalflux_elem_ids[i];
109 numericalflux_node_ids[1] = numericalflux_elem_ids[1];
114 for(
int i=0;i<numnodes;i++) numericalflux_node_ids[i] = numericalflux_node_ids[i];
122 this->
id = numericalflux_id;
126 this->
hnodes =
new Hook(numericalflux_node_ids,numnodes);
152 numericalflux->
id=this->
id;
169 return numericalflux;
219 this->
hnodes->
Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
220 this->
helement->
Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
221 this->
hvertices->
Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
263 switch(analysis_type){
274 _error_(
"analysis " << analysis_type <<
" (" <<
EnumToStringx(analysis_type) <<
") not supported yet");
292 switch(analysis_type){
303 _error_(
"analysis " << analysis_type <<
" (" <<
EnumToStringx(analysis_type) <<
") not supported yet");
320 for(
int i=0;i<numnodes;i++) lidlist[i]=
nodes[i]->Lid();
329 for(
int i=0;i<numnodes;i++) sidlist[i]=
nodes[i]->Sid();
420 if(!flags[this->
nodes[i]->Lid()]){
426 while(flagsindices[counter]>=0) counter++;
427 flagsindices[counter]=this->nodes[i]->Lid();
433 if(this->nodes[i]->IsClone())
441 if(this->nodes[i]->IsClone())
449 if(this->nodes[i]->IsClone())
455 default:
_error_(
"not supported");
475 _error_(
"type not supported yet");
501 _error_(
"type not supported yet");
532 IssmDouble UdotN=mean_vx*normal[0]+mean_vy*normal[1];
540 IssmDouble *basis = xNew<IssmDouble>(numnodes);
544 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
552 UdotN=vx*normal[0]+vy*normal[1];
554 DL=gauss->
weight*Jdet*UdotN;
556 for(
int i=0;i<numnodes;i++){
557 for(
int j=0;j<numnodes;j++){
558 Ke->
values[i*numnodes+j]+=DL*basis[i]*basis[j];
564 xDelete<IssmDouble>(basis);
583 int numnodes_minus = numnodes_plus;
584 _assert_(numnodes==numnodes_plus+numnodes_minus);
588 IssmDouble *basis_plus = xNew<IssmDouble>(numnodes_plus);
589 IssmDouble *basis_minus = xNew<IssmDouble>(numnodes_minus);
601 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
610 UdotN=vx*normal[0]+vy*normal[1];
612 A1=gauss->
weight*Jdet*UdotN/2;
613 A2=gauss->
weight*Jdet*fabs(UdotN)/2;
628 for(
int i=0;i<numnodes_plus;i++){
629 for(
int j=0;j<numnodes_plus;j++){
630 Ke->
values[i*numnodes+j] += A1*(basis_plus[j]*basis_plus[i]);
631 Ke->
values[i*numnodes+j] += A2*(basis_plus[j]*basis_plus[i]);
635 for(
int i=0;i<numnodes_plus;i++){
636 for(
int j=0;j<numnodes_minus;j++){
637 Ke->
values[i*numnodes+numnodes_plus+j] += A1*(basis_minus[j]*basis_plus[i]);
638 Ke->
values[i*numnodes+numnodes_plus+j] += -A2*(basis_minus[j]*basis_plus[i]);
642 for(
int i=0;i<numnodes_minus;i++){
643 for(
int j=0;j<numnodes_plus;j++){
644 Ke->
values[(numnodes_plus+i)*numnodes+j] += -A1*(basis_plus[j]*basis_minus[i]);
645 Ke->
values[(numnodes_plus+i)*numnodes+j] += -A2*(basis_plus[j]*basis_minus[i]);
649 for(
int i=0;i<numnodes_minus;i++){
650 for(
int j=0;j<numnodes_minus;j++){
651 Ke->
values[(numnodes_plus+i)*numnodes+numnodes_plus+j] += -A1*(basis_minus[j]*basis_minus[i]);
652 Ke->
values[(numnodes_plus+i)*numnodes+numnodes_plus+j] += A2*(basis_minus[j]*basis_minus[i]);
658 xDelete<IssmDouble>(basis_plus);
659 xDelete<IssmDouble>(basis_minus);
672 _error_(
"type not supported yet");
704 IssmDouble UdotN=mean_vx*normal[0]+mean_vy*normal[1];
712 IssmDouble *basis = xNew<IssmDouble>(numnodes);
716 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
724 UdotN=vx*normal[0]+vy*normal[1];
726 DL=gauss->
weight*Jdet*dt*UdotN;
728 for(
int i=0;i<numnodes;i++){
729 for(
int j=0;j<numnodes;j++){
730 Ke->
values[i*numnodes+j]+=DL*basis[i]*basis[j];
736 xDelete<IssmDouble>(basis);
755 int numnodes_minus = numnodes_plus;
756 _assert_(numnodes==numnodes_plus+numnodes_minus);
760 IssmDouble *basis_plus = xNew<IssmDouble>(numnodes_plus);
761 IssmDouble *basis_minus = xNew<IssmDouble>(numnodes_minus);
774 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
783 UdotN=vx*normal[0]+vy*normal[1];
785 A1=gauss->
weight*Jdet*dt*UdotN/2;
786 A2=gauss->
weight*Jdet*dt*fabs(UdotN)/2;
801 for(
int i=0;i<numnodes_plus;i++){
802 for(
int j=0;j<numnodes_plus;j++){
803 Ke->
values[i*numnodes+j] += A1*(basis_plus[j]*basis_plus[i]);
804 Ke->
values[i*numnodes+j] += A2*(basis_plus[j]*basis_plus[i]);
808 for(
int i=0;i<numnodes_plus;i++){
809 for(
int j=0;j<numnodes_minus;j++){
810 Ke->
values[i*numnodes+numnodes_plus+j] += A1*(basis_minus[j]*basis_plus[i]);
811 Ke->
values[i*numnodes+numnodes_plus+j] += -A2*(basis_minus[j]*basis_plus[i]);
815 for(
int i=0;i<numnodes_minus;i++){
816 for(
int j=0;j<numnodes_plus;j++){
817 Ke->
values[(numnodes_plus+i)*numnodes+j] += -A1*(basis_plus[j]*basis_minus[i]);
818 Ke->
values[(numnodes_plus+i)*numnodes+j] += -A2*(basis_plus[j]*basis_minus[i]);
822 for(
int i=0;i<numnodes_minus;i++){
823 for(
int j=0;j<numnodes_minus;j++){
824 Ke->
values[(numnodes_plus+i)*numnodes+numnodes_plus+j] += -A1*(basis_minus[j]*basis_minus[i]);
825 Ke->
values[(numnodes_plus+i)*numnodes+numnodes_plus+j] += A2*(basis_minus[j]*basis_minus[i]);
831 xDelete<IssmDouble>(basis_plus);
832 xDelete<IssmDouble>(basis_minus);
851 _error_(
"type not supported yet");
862 IssmDouble DL,Jdet,vx,vy,mean_vx,mean_vy,thickness;
881 IssmDouble UdotN=mean_vx*normal[0]+mean_vy*normal[1];
889 IssmDouble *basis = xNew<IssmDouble>(numnodes);
893 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
903 UdotN=vx*normal[0]+vy*normal[1];
905 DL= - gauss->
weight*Jdet*UdotN*thickness;
907 for(
int i=0;i<numnodes;i++) pe->
values[i] += DL*basis[i];
911 xDelete<IssmDouble>(basis);
931 _error_(
"type not supported yet");
942 IssmDouble DL,Jdet,vx,vy,mean_vx,mean_vy,thickness;
962 IssmDouble UdotN=mean_vx*normal[0]+mean_vy*normal[1];
970 IssmDouble *basis = xNew<IssmDouble>(numnodes);
974 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
983 if(xIsNan<IssmDouble>(thickness))
_error_(
"Cannot weakly apply constraint because NaN was provided");
985 UdotN=vx*normal[0]+vy*normal[1];
987 DL= - gauss->
weight*Jdet*dt*UdotN*thickness;
989 for(
int i=0;i<numnodes;i++) pe->
values[i] += DL*basis[i];
993 xDelete<IssmDouble>(basis);
1010 vector[0]=xyz_list[1][0] - xyz_list[0][0];
1011 vector[1]=xyz_list[1][1] - xyz_list[0][1];
1013 IssmDouble norm=sqrt(pow(vector[0],2.0)+pow(vector[1],2.0));
1015 normal[0]= + vector[1]/norm;
1016 normal[1]= - vector[0]/norm;