64 PulseWaveSystem::PulseWaveSystem(
96 ASSERTL0(
m_session->MatchSolverInfo(
"Projection",
"DisContinuous"),
"Pulse solver only set up for Discontinuous projections");
98 ASSERTL0(
m_graph->GetMeshDimension() == 1,
"Pulse wave solver only set up for expansion dimension equal to 1");
106 const std::vector<SpatialDomains::CompositeMap> domain =
m_graph->GetDomain();
112 bool SetToOneSpaceDimension =
true;
114 if(
m_session->DefinesCmdLineArgument(
"SetToOneSpaceDimension"))
116 std::string cmdline =
m_session->GetCmdLineArgument<std::string>(
"SetToOneSpaceDimension");
117 if(boost::to_upper_copy(cmdline) ==
"FALSE")
119 SetToOneSpaceDimension =
false;
131 SetToOneSpaceDimension);
154 m_vessels[n]->SetCoeffsArray(coeffs);
155 m_vessels[n]->SetPhysArray(phys);
157 int cnt = m_vessels[n]->GetNcoeffs();
158 int cnt1 = m_vessels[n]->GetTotPoints();
162 m_vessels[i*m_nVariables+n]->SetCoeffsArray(tmpcoeffs = coeffs + cnt);
163 m_vessels[i*m_nVariables+n]->SetPhysArray (tmpphys = phys + cnt1);
164 cnt += m_vessels[i*m_nVariables+n]->GetNcoeffs();
165 cnt1 += m_vessels[i*m_nVariables+n]->GetTotPoints();
209 for (
int omega = 0; omega <
m_nDomains; omega++)
211 nq = m_vessels[2*omega]->GetNpoints();
226 m_fields[0]->ExtractTracePhys(m_A_0[omega],m_A_0_trace[omega]);
229 if(SetToOneSpaceDimension)
234 int nelmt_trace = trace->GetExpSize();
238 for(
int i = 0 ; i < nelmt_trace; ++i)
240 normals[i] = m_trace_fwd_normal[omega]+i;
245 trace->GetExp(0)->GetGeom()->SetCoordim(1);
247 trace->GetNormals(normals);
257 map<int,std::vector<InterfacePointShPtr> > VidToDomain;
263 for(
int omega = 0; omega <
m_nDomains; ++omega)
267 for(
int i = 0; i < 2; ++i)
272 int vid =
m_vessels[vesselID]->UpdateBndCondExpansion(i)->GetExp(0)->GetGeom()->GetVid(0);
273 cout<<
"Shared vertex id: "<<vid<<endl;
279 for(
int n = 0; n <
m_vessels[vesselID]->GetExpSize(); ++n)
281 for(
int p = 0;
p < 2; ++
p)
285 int eid =
m_vessels[vesselID]->GetTraceMap()->GetElmtToTrace()[n][
p]->GetElmtId();
287 int tid =
m_vessels[vesselID]->GetTrace()->GetCoeff_Offset(eid);
290 cout<<
"Global Vid of interface point: "<<vid<<endl;
291 cout<<
"Domain interface point belongs to: "<<omega<<endl;
292 cout<<
"Element id of vertex: "<<n<<endl;
293 cout<<
"Vertex id within local element: "<<
p<<endl;
294 cout<<
"Element id within the trace: "<<tid<<endl;
295 cout<<
"Position of boundary condition in region: "<<i<<endl;
307 VidToDomain[vid].push_back(Ipt);
310 m_vessels[vesselID]->GetBndConditions()[i]
313 m_vessels[vesselID+1]->GetBndConditions()[i]
320 for(
auto &iter : VidToDomain)
322 if(iter.second.size() == 2)
326 else if(iter.second.size() == 3)
335 for(
int i = 0; i < 3; ++i)
337 if(iter.second[i]->m_elmtVert == 0)
351 if(iter.second[0]->m_elmtVert == 1)
360 if(iter.second[1]->m_elmtVert == 1)
363 iter.second[0] = iter.second[1];
366 else if (iter.second[2]->m_elmtVert == 1)
369 iter.second[0] = iter.second[2];
378 if(iter.second[0]->m_elmtVert == 0)
387 if(iter.second[1]->m_elmtVert == 0)
390 iter.second[0] = iter.second[1];
393 else if (iter.second[2]->m_elmtVert == 0)
396 iter.second[0] = iter.second[2];
406 ASSERTL0(
false,
"Unknown junction type");
422 if (
m_session->GetComm()->GetRank() == 0)
424 cout <<
"Initial Conditions:" << endl;
429 for (
int omega = 0; omega <
m_nDomains; omega++)
434 if (
m_session->GetComm()->GetRank() == 0)
436 cout <<
"Subdomain = " <<omega<<endl;
494 cout <<
"Steps: " << n+1
496 <<
"\t Time-step: " <<
m_timestep <<
"\t" << endl;
505 for (
int omega = 0; omega <
m_nDomains; omega++)
507 m_vessels[omega*m_nVariables+i]->FwdTrans(fields[i]+cnt,
508 m_vessels[omega*m_nVariables+i]->UpdateCoeffs());
509 cnt +=
m_vessels[omega*m_nVariables+i]->GetTotPoints();
523 cout <<
"Time-integration timing : " 524 << IntegrationTime <<
" s" << endl << endl;
534 int omega, traceId, eid, vert, phys_offset, vesselID;
539 traceId = I->m_traceId;
541 vert = I->m_elmtVert;
544 phys_offset =
m_vessels[vesselID]->GetPhys_Offset(eid);
565 Au[0],uu[0],beta[0],A_0[0]);
567 Au[1],uu[1],beta[1],A_0[1]);
569 Au[2],uu[2],beta[2],A_0[2]);
575 for(
int i = 0; i < 3; ++i)
589 Au[0],uu[0],beta[0],A_0[0]);
591 Au[1],uu[1],beta[1],A_0[1]);
593 Au[2],uu[2],beta[2],A_0[2]);
599 for(
int i = 0; i < 3; ++i)
612 Au[0],uu[0],beta[0],A_0[0]);
614 Au[1],uu[1],beta[1],A_0[1]);
619 for(
int i = 0; i < 2; ++i)
655 for (
int i=0; i<6; i++)
669 W[0] = uu[0] + 4*sqrt(beta[0]/(2*rho))*(sqrt(sqrt(Au[0])) - sqrt(sqrt(A_0[0])));
670 W[1] = uu[1] - 4*sqrt(beta[1]/(2*rho))*(sqrt(sqrt(Au[1])) - sqrt(sqrt(A_0[1])));
671 W[2] = uu[2] - 4*sqrt(beta[2]/(2*rho))*(sqrt(sqrt(Au[2])) - sqrt(sqrt(A_0[2])));
677 while ((proceed) && (iter < MAX_ITER))
684 W_Au[0] = 4*sqrt(beta[0]/(2*rho))*(sqrt(sqrt(Au[0])) - sqrt(sqrt(A_0[0])));
685 W_Au[1] = 4*sqrt(beta[1]/(2*rho))*(sqrt(sqrt(Au[1])) - sqrt(sqrt(A_0[1])));
686 W_Au[2] = 4*sqrt(beta[2]/(2*rho))*(sqrt(sqrt(Au[2])) - sqrt(sqrt(A_0[2])));
688 P_Au[0] = beta[0]*(sqrt(Au[0]) - sqrt(A_0[0]));
689 P_Au[1] = beta[1]*(sqrt(Au[1]) - sqrt(A_0[1]));
690 P_Au[2] = beta[2]*(sqrt(Au[2]) - sqrt(A_0[2]));
692 f[0] = uu[0] + W_Au[0] - W[0];
693 f[1] = uu[1] - W_Au[1] - W[1];
694 f[2] = uu[2] - W_Au[2] - W[2];
695 f[3] = Au[0]*uu[0] - Au[1]*uu[1] - Au[2]*uu[2];
696 f[4] = uu[0]*uu[0] + 2.0/rho*P_Au[0] - uu[1]*uu[1] - 2.0/rho*P_Au[1];
697 f[5] = uu[0]*uu[0] + 2.0/rho*P_Au[0] - uu[2]*uu[2] - 2.0/rho*P_Au[2];
700 NekDouble c1 = sqrt(beta[0]/(2*rho))*sqrt(sqrt(Au[0]));
701 NekDouble c2 = sqrt(beta[1]/(2*rho))*sqrt(sqrt(Au[1]));
702 NekDouble c3 = sqrt(beta[2]/(2*rho))*sqrt(sqrt(Au[2]));
706 k = c1*Au[1]*c3+Au[0]*c3*c2+Au[2]*c1*c2;
708 inv_J[0][0] = (-c2*uu[0]*c3*Au[0]+Au[2]*c2*c1*c1+Au[1]*c1*c1*c3)/k1;
709 inv_J[0][1] = Au[1]*(c2-uu[1])*c1*c3/k1;
710 inv_J[0][2] = Au[2]*(c3-uu[2])*c1*c2/k1;
711 inv_J[0][3] = c1*c2*c3/k1;
712 inv_J[0][4] = -0.5*c1*Au[1]*c3/k1;
713 inv_J[0][5] = -0.5*Au[2]*c1*c2/k1;
716 inv_J[1][0] = Au[0]*(c1+uu[0])*c2*c3/k2;
717 inv_J[1][1] = (c1*uu[1]*c3*Au[1]+Au[2]*c1*c2*c2+c3*c2*c2*Au[0])/k2;
718 inv_J[1][2] = -Au[2]*(c3-uu[2])*c1*c2/k2;
719 inv_J[1][3] = -c1*c2*c3/k2;
720 inv_J[1][4] = -0.5*(c1*Au[2]+Au[0]*c3)*c2/k2;
721 inv_J[1][5] = 0.5*Au[2]*c1*c2/k2;
724 inv_J[2][0] = Au[0]*(c1+uu[0])*c2*c3/k3;
725 inv_J[2][1] = -Au[1]*(c2-uu[1])*c1*c3/k3;
726 inv_J[2][2] = (c1*c2*uu[2]*Au[2]+c1*Au[1]*c3*c3+c2*c3*c3*Au[0])/k3;
727 inv_J[2][3] = -c1*c2*c3/k3;
728 inv_J[2][4] = 0.5*c1*Au[1]*c3/k3;
729 inv_J[2][5] = -0.5*(Au[1]*c1+c2*Au[0])*c3/k3;
731 inv_J[3][0] = Au[0]*(Au[0]*c3*c2-uu[0]*c3*Au[1]-uu[0]*c2*Au[2])/k1;
732 inv_J[3][1] = -Au[0]*Au[1]*(c2-uu[1])*c3/k1;
733 inv_J[3][2] = -Au[0]*Au[2]*(c3-uu[2])*c2/k1;
734 inv_J[3][3] = -Au[0]*c3*c2/k1;
735 inv_J[3][4] = 0.5*Au[0]*Au[1]*c3/k1;
736 inv_J[3][5] = 0.5*Au[0]*c2*Au[2]/k1;
738 inv_J[4][0] = Au[0]*Au[1]*(c1+uu[0])*c3/k2;
739 inv_J[4][1] = -Au[1]*(c1*Au[1]*c3+c1*uu[1]*Au[2]+c3*uu[1]*Au[0])/k2;
740 inv_J[4][2] = -Au[2]*Au[1]*(c3-uu[2])*c1/k2;
741 inv_J[4][3] = -c1*Au[1]*c3/k2;
742 inv_J[4][4] = -0.5*Au[1]*(c1*Au[2]+Au[0]*c3)/k2;
743 inv_J[4][5] = 0.5*Au[2]*Au[1]*c1/k2;
745 inv_J[5][0] = Au[0]*Au[2]*(c1+uu[0])*c2/k3;
746 inv_J[5][1] = -Au[2]*Au[1]*(c2-uu[1])*c1/k3;
747 inv_J[5][2] = -Au[2]*(Au[2]*c1*c2+c1*uu[2]*Au[1]+c2*uu[2]*Au[0])/k3;
748 inv_J[5][3] = -Au[2]*c1*c2/k3;
749 inv_J[5][4] = 0.5*Au[2]*Au[1]*c1/k3;
750 inv_J[5][5] = -0.5*Au[2]*(Au[1]*c1+c2*Au[0])/k3;
755 for (
int j=0; j<6; j++)
761 for (
int j=0; j<6; j++)
763 for (
int i=0; i<6; i++)
765 tmp[j] = inv_J[j][i]*f[i];
771 uu[0] = uu[0] - g[0];
772 uu[1] = uu[1] - g[1];
773 uu[2] = uu[2] - g[2];
774 Au[0] = Au[0] - g[3];
775 Au[1] = Au[1] - g[4];
776 Au[2] = Au[2] - g[5];
779 if ((g[0]*g[0] + g[1]*g[1] + g[2]*g[2] + g[3]*g[3]+ g[4]*g[4] + g[5]*g[5]) < Tol)
785 if (iter >= MAX_ITER)
787 ASSERTL0(
false,
"Riemann solver for Bifurcation did not converge");
814 for (
int i=0; i<6; i++)
829 W[0] = uu[0] - 4*sqrt(beta[0]/(2*rho))*(sqrt(sqrt(Au[0])) - sqrt(sqrt(A_0[0])));
830 W[1] = uu[1] + 4*sqrt(beta[1]/(2*rho))*(sqrt(sqrt(Au[1])) - sqrt(sqrt(A_0[1])));
831 W[2] = uu[2] + 4*sqrt(beta[2]/(2*rho))*(sqrt(sqrt(Au[2])) - sqrt(sqrt(A_0[2])));
837 while ((proceed) && (iter < MAX_ITER))
844 W_Au[0] = 4*sqrt(beta[0]/(2*rho))*(sqrt(sqrt(Au[0])) - sqrt(sqrt(A_0[0])));
845 W_Au[1] = 4*sqrt(beta[1]/(2*rho))*(sqrt(sqrt(Au[1])) - sqrt(sqrt(A_0[1])));
846 W_Au[2] = 4*sqrt(beta[2]/(2*rho))*(sqrt(sqrt(Au[2])) - sqrt(sqrt(A_0[2])));
848 P_Au[0] = beta[0]*(sqrt(Au[0]) - sqrt(A_0[0]));
849 P_Au[1] = beta[1]*(sqrt(Au[1]) - sqrt(A_0[1]));
850 P_Au[2] = beta[2]*(sqrt(Au[2]) - sqrt(A_0[2]));
852 f[0] = uu[0] - W_Au[0] - W[0];
853 f[1] = uu[1] + W_Au[1] - W[1];
854 f[2] = uu[2] + W_Au[2] - W[2];
855 f[3] = Au[0]*uu[0] - Au[1]*uu[1] - Au[2]*uu[2];
856 f[4] = uu[0]*uu[0] + 2.0/rho*P_Au[0] - uu[1]*uu[1] - 2.0/rho*P_Au[1];
857 f[5] = uu[0]*uu[0] + 2.0/rho*P_Au[0] - uu[2]*uu[2] - 2.0/rho*P_Au[2];
860 NekDouble c1 = sqrt(beta[0]/(2*rho))*sqrt(sqrt(Au[0]));
861 NekDouble c2 = sqrt(beta[1]/(2*rho))*sqrt(sqrt(Au[1]));
862 NekDouble c3 = sqrt(beta[2]/(2*rho))*sqrt(sqrt(Au[2]));
865 k = c1*Au[1]*c3+Au[0]*c3*c2+Au[2]*c1*c2;
867 inv_J[0][0] = (c2*uu[0]*c3*Au[0]+Au[2]*c2*c1*c1+Au[1]*c1*c1*c3)/k1;
868 inv_J[0][1] = Au[1]*(c2+uu[1])*c1*c3/k1;
869 inv_J[0][2] = Au[2]*(c3+uu[2])*c1*c2/k1;
870 inv_J[0][3] = c1*c2*c3/k1;
871 inv_J[0][4] = 0.5*Au[1]*c1*c3/k1;
872 inv_J[0][5] = 0.5*Au[2]*c1*c2/k1;
875 inv_J[1][0] = Au[0]*(c1-uu[0])*c2*c3/k2;
876 inv_J[1][1] = (-c1*uu[1]*c3*Au[1]+Au[2]*c1*c2*c2+c3*c2*c2*Au[0])/k2;
877 inv_J[1][2] = -Au[2]*(c3+uu[2])*c1*c2/k2;
878 inv_J[1][3] = -c1*c2*c3/k2;
879 inv_J[1][4] = 0.5*(c1*Au[2]+Au[0]*c3)*c2/k2;
880 inv_J[1][5] = -0.5*Au[2]*c1*c2/k2;
883 inv_J[2][0] = Au[0]*(c1-uu[0])*c2*c3/k3;
884 inv_J[2][1] = -Au[1]*(c2+uu[1])*c1*c3/k3;
885 inv_J[2][2] = -(c1*uu[2]*c2*Au[2]-Au[1]*c1*c3*c3-c2*c3*c3*Au[0])/k3;
886 inv_J[2][3] = -c1*c2*c3/k3;
887 inv_J[2][4] = -0.5*Au[1]*c1*c3/k3;
888 inv_J[2][5] = 0.5*(Au[1]*c1+Au[0]*c2)*c3/k3;
890 inv_J[3][0] = -Au[0]*(Au[0]*c3*c2+uu[0]*c3*Au[1]+uu[0]*c2*Au[2])/k1;
891 inv_J[3][1] = Au[0]*Au[1]*(c2+uu[1])*c3/k1;
892 inv_J[3][2] = Au[0]*Au[2]*(c3+uu[2])*c2/k1;
893 inv_J[3][3] = Au[0]*c3*c2/k1;
894 inv_J[3][4] = 0.5*Au[0]*Au[1]*c3/k1;
895 inv_J[3][5] = 0.5*Au[0]*c2*Au[2]/k1;
897 inv_J[4][0] = -Au[0]*Au[1]*(c1-uu[0])*c3/k2;
898 inv_J[4][1] = Au[1]*(Au[1]*c1*c3-c1*uu[1]*Au[2]-c3*uu[1]*Au[0])/k2;
899 inv_J[4][2] = Au[2]*Au[1]*(c3+uu[2])*c1/k2;
900 inv_J[4][3] = Au[1]*c1*c3/k2;
901 inv_J[4][4] = -0.5*Au[1]*(c1*Au[2]+Au[0]*c3)/k2;
902 inv_J[4][5] = 0.5*Au[2]*Au[1]*c1/k2;
904 inv_J[5][0] = -Au[0]*Au[2]*(c1-uu[0])*c2/k3;
905 inv_J[5][1] = Au[2]*Au[1]*(c2+uu[1])*c1/k3;
906 inv_J[5][2] = Au[2]*(Au[2]*c1*c2-c1*uu[2]*Au[1]-c2*uu[2]*Au[0])/k3;
907 inv_J[5][3] = Au[2]*c1*c2/k3;
908 inv_J[5][4] = 0.5*Au[2]*Au[1]*c1/k3;
909 inv_J[5][5] = -0.5*Au[2]*(Au[1]*c1+Au[0]*c2)/k3;
913 for (
int j=0; j<6; j++)
919 for (
int j=0; j<6; j++)
921 for (
int i=0; i<6; i++)
923 tmp[j] = inv_J[j][i]*f[i];
929 uu[0] = uu[0] - g[0];
930 uu[1] = uu[1] - g[1];
931 uu[2] = uu[2] - g[2];
932 Au[0] = Au[0] - g[3];
933 Au[1] = Au[1] - g[4];
934 Au[2] = Au[2] - g[5];
937 if ((g[0]*g[0] + g[1]*g[1] + g[2]*g[2] + g[3]*g[3]+ g[4]*g[4] + g[5]*g[5]) < Tol)
943 if (iter >= MAX_ITER)
945 ASSERTL0(
false,
"Riemann solver for Merging Flow did not converge");
971 for (
int i=0; i<4; i++)
985 W[0] = uu[0] + 4*sqrt(beta[0]/(2*rho))*(sqrt(sqrt(Au[0])) - sqrt(sqrt(A_0[0])));
986 W[1] = uu[1] - 4*sqrt(beta[1]/(2*rho))*(sqrt(sqrt(Au[1])) - sqrt(sqrt(A_0[1])));
988 while((proceed) && (iter < MAX_ITER))
995 W_Au[0] = 4*sqrt(beta[0]/(2*rho))*(sqrt(sqrt(Au[0])) - sqrt(sqrt(A_0[0])));
996 W_Au[1] = 4*sqrt(beta[1]/(2*rho))*(sqrt(sqrt(Au[1])) - sqrt(sqrt(A_0[1])));
998 P_Au[0] = beta[0]*(sqrt(Au[0]) - sqrt(A_0[0]));
999 P_Au[1] = beta[1]*(sqrt(Au[1]) - sqrt(A_0[1]));
1001 f[0] = uu[0] + W_Au[0] - W[0];
1002 f[1] = uu[1] - W_Au[1] - W[1];
1003 f[2] = Au[0]*uu[0] - Au[1]*uu[1];
1004 f[3] = uu[0]*uu[0] + 2.0/rho*P_Au[0] - uu[1]*uu[1] - 2.0/rho*P_Au[1];
1007 NekDouble cl = sqrt(beta[0]/(2*rho))*sqrt(sqrt(Au[0]));
1008 NekDouble cr = sqrt(beta[1]/(2*rho))*sqrt(sqrt(Au[1]));
1011 k = (cl*Au[1]+Au[0]*cr);
1013 inv_J[0][0] = (Au[1]*cl*cl-cr*uu[0]*Au[0])/k1;
1014 inv_J[0][1] = Au[1]*(cr-uu[1])*cl/k1;
1015 inv_J[0][2] = cl*cr/k1;
1016 inv_J[0][3] = -0.5*cl*Au[1]/k1;
1019 inv_J[1][0] = Au[0]*(cl+uu[0])*cr/k2;
1020 inv_J[1][1] = (cl*uu[1]*Au[1]+cr*cr*Au[0])/k2;
1021 inv_J[1][2] = -cl*cr/k2;
1022 inv_J[1][3] = -0.5*Au[0]*cr/k2;
1024 inv_J[2][0] = Au[0]*(Au[0]*cr-uu[0]*Au[1])/k1;
1025 inv_J[2][1] = -Au[0]*Au[1]*(cr-uu[1])/k1;
1026 inv_J[2][2] = -Au[0]*cr/k1;
1027 inv_J[2][3] = 0.5*Au[1]*Au[0]/k1;
1029 inv_J[3][0] = Au[0]*Au[1]*(cl+uu[0])/k2;
1030 inv_J[3][1] = -Au[1]*(cl*Au[1]+uu[1]*Au[0])/k2;
1031 inv_J[3][2] = -cl*Au[1]/k2;
1032 inv_J[3][3] = -0.5*Au[1]*Au[0]/k2;
1036 for (
int j=0; j<4; j++)
1042 for (
int j=0; j<4; j++)
1044 for (
int i=0; i<4; i++)
1046 tmp[j] = inv_J[j][i]*f[i];
1058 if((g[0]*g[0] + g[1]*g[1] + g[2]*g[2] + g[3]*g[3]) < Tol)
1062 if(iter >= MAX_ITER)
1064 ASSERTL0(
false,
"Riemann solver for Junction did not converge");
1092 std::stringstream outname;
1106 std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef;
1107 std::vector<std::string> variables =
m_session->GetVariables();
1114 std::vector<std::vector<NekDouble> > FieldData(FieldDef.size());
1116 int nFieldDefPerDomain = FieldDef.size()/
m_nDomains;
1123 for(
int i = 0; i < nFieldDefPerDomain; ++i)
1125 cnt = n*nFieldDefPerDomain+i;
1126 FieldDef[cnt]->m_fields.push_back(variables[j]);
1159 for (
int omega = 0; omega <
m_nDomains; omega++)
1163 if(
m_vessels[vesselid]->GetPhysState() ==
false)
1169 if(exactsoln.num_elements())
1175 else if (
m_session->DefinesFunction(
"ExactSolution"))
1180 =
m_session->GetFunction(
"ExactSolution",field,omega);
1194 L2error += L2error_dom*L2error_dom;
1196 if(Normalised ==
true)
1200 Vol +=
m_vessels[vesselid]->PhysIntegral(one);
1211 if(Normalised ==
true)
1215 L2error = sqrt(L2error/Vol);
1219 L2error = sqrt(L2error);
1235 NekDouble LinferrorDom, Linferror = -1.0;
1237 for (
int omega = 0; omega <
m_nDomains; omega++)
1243 if(
m_vessels[vesselid]->GetPhysState() ==
false)
1249 if(exactsoln.num_elements())
1251 LinferrorDom =
m_vessels[vesselid]->Linf(
1255 else if (
m_session->DefinesFunction(
"ExactSolution"))
1261 LinferrorDom =
m_vessels[vesselid]->Linf(
1270 Linferror = (Linferror > LinferrorDom)? Linferror:LinferrorDom;
1275 ASSERTL0(
false,
"ErrorExtraPoints not allowed for this solver");
1283 int nq =
m_vessels[omega]->GetTotPoints();
Array< OneD, int > m_fieldPhysOffset
Array< OneD, Array< OneD, NekDouble > > m_beta_trace
#define ASSERTL0(condition, msg)
void CheckPoint_Output(const int n)
UpwindTypePulse m_upwindTypePulse
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
NekDouble m_time
Current time of simulation.
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
NekDouble m_timestep
Time step size.
NekDouble TimePerTest(unsigned int n)
Returns amount of seconds per iteration in a test with n iterations.
enum MultiRegions::ProjectionType m_projectionType
Type of projection; e.g continuous or discontinuous.
const char *const UpwindTypeMapPulse[]
virtual void v_DoSolve()
Solves an unsteady problem.
Array< OneD, Array< OneD, NekDouble > > m_trace_fwd_normal
virtual void v_InitObject()
void BifurcationRiemann(Array< OneD, NekDouble > &Au, Array< OneD, NekDouble > &uu, Array< OneD, NekDouble > &beta, Array< OneD, NekDouble > &A_0)
Riemann Problem for Bifurcation.
std::string m_sessionName
Name of the session.
int m_checksteps
Number of steps between checkpoints.
void EnforceInterfaceConditions(const Array< OneD, const Array< OneD, NekDouble > > &fields)
LibUtilities::CommSharedPtr m_comm
Communicator.
Array< OneD, Array< OneD, NekDouble > > m_A_0_trace
int m_steps
Number of steps to take.
void WriteVessels(const std::string &outname)
Write input fields to the given filename.
std::vector< std::vector< InterfacePointShPtr > > m_vesselJcts
virtual void v_DoInitialise()
Sets up initial conditions.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
void SetUpDomainInterfaces(void)
void MergingRiemann(Array< OneD, NekDouble > &Au, Array< OneD, NekDouble > &uu, Array< OneD, NekDouble > &beta, Array< OneD, NekDouble > &A_0)
Riemann Problem for Merging Flow.
Base class for unsteady solvers.
Array< OneD, Array< OneD, NekDouble > > m_A_0
std::vector< std::vector< InterfacePointShPtr > > m_bifurcations
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
LibUtilities::FieldMetaDataMap m_fieldMetaDataMap
Map to identify relevant solver info to dump in output fields.
virtual void v_Output(void)
NekDouble v_LinfError(unsigned int field, const Array< OneD, NekDouble > &exactsoln=NullNekDouble1DArray)
Compute the L_inf error between fields and a given exact solution.
virtual SOLVER_UTILS_EXPORT void v_InitObject()
Init object for UnsteadySystem class.
void Write(const std::string &outFile, std::vector< FieldDefinitionsSharedPtr > &fielddefs, std::vector< std::vector< NekDouble > > &fielddata, const FieldMetaDataMap &fieldinfomap, const bool backup)
This function allows for data to be written to an FLD file when a session and/or communicator is not ...
void CalcCharacteristicVariables(int omega)
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
std::shared_ptr< Equation > EquationSharedPtr
SOLVER_UTILS_EXPORT int GetTraceTotPoints()
SOLVER_UTILS_EXPORT SessionFunctionSharedPtr GetFunction(std::string name, const MultiRegions::ExpListSharedPtr &field=MultiRegions::NullExpListSharedPtr, bool cache=false)
Get a SessionFunction by name.
std::shared_ptr< InterfacePoint > InterfacePointShPtr
Array< OneD, Array< OneD, NekDouble > > m_beta
SOLVER_UTILS_EXPORT int GetNpoints()
void FillDataFromInterfacePoint(InterfacePointShPtr &I, const Array< OneD, const Array< OneD, NekDouble > > &field, NekDouble &A, NekDouble &u, NekDouble &beta, NekDouble &A_0)
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
LibUtilities::TimeIntegrationWrapperSharedPtr m_intScheme
Wrapper to the time integration scheme.
SOLVER_UTILS_EXPORT void ZeroPhysFields()
int m_infosteps
Number of time steps between outputting status information.
SpatialDomains::MeshGraphSharedPtr m_graph
Pointer to graph defining mesh.
SOLVER_UTILS_EXPORT void SetInitialConditions(NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0)
Initialise the data in the dependent fields.
void JunctionRiemann(Array< OneD, NekDouble > &Au, Array< OneD, NekDouble > &uu, Array< OneD, NekDouble > &beta, Array< OneD, NekDouble > &A_0)
Riemann Problem for Junction.
NekDouble v_L2Error(unsigned int field, const Array< OneD, NekDouble > &exactsoln=NullNekDouble1DArray, bool Normalised=false)
Compute the L2 error between fields and a given exact solution.
virtual ~PulseWaveSystem()
Destructor.
int m_NumQuadPointsError
Number of Quadrature points used to work out the error.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Array< OneD, MultiRegions::ExpListSharedPtr > m_vessels
LibUtilities::TimeIntegrationSolutionSharedPtr m_intSoln
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::vector< std::vector< InterfacePointShPtr > > m_mergingJcts
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.