48int main(
int argc,
char *argv[]) {
54 moab::Core mb_instance;
55 moab::Interface& moab = mb_instance;
57 MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
59 PetscBool flg = PETSC_TRUE;
62 if(flg != PETSC_TRUE) {
63 SETERRQ(PETSC_COMM_SELF,1,
"*** ERROR -my_file (MESH FILE NEEDED)");
67 if(flg != PETSC_TRUE) {
73 PetscInt mesh_refinement_level;
75 if(flg != PETSC_TRUE) {
76 mesh_refinement_level = 0;
83 ParallelComm* pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
84 if(pcomm == NULL) pcomm =
new ParallelComm(&moab,PETSC_COMM_WORLD);
96 Range SurTrisNeg, SurTrisPos;
97 ierr = m_field.get_cubit_msId_entities_by_dimension(101,
SIDESET,2,SurTrisNeg,
true); CHKERRQ(
ierr);
98 ierr = PetscPrintf(PETSC_COMM_WORLD,
"number of SideSet 101 = %d\n",SurTrisNeg.size()); CHKERRQ(
ierr);
99 ierr = m_field.get_cubit_msId_entities_by_dimension(102,
SIDESET,2,SurTrisPos,
true); CHKERRQ(
ierr);
100 ierr = PetscPrintf(PETSC_COMM_WORLD,
"number of SideSet 102 = %d\n",SurTrisPos.size()); CHKERRQ(
ierr);
102 Range SurNodesNeg,SurNodesPos;
104 cout<<
" All nodes on negative surfaces " << SurNodesNeg.size()<<endl;
106 cout<<
" All nodes on positive surfaces " << SurNodesPos.size()<<endl;
109 double roundfact=1e3;
double coords_nodes[3];
110 for(Range::iterator nit = SurNodesNeg.begin(); nit!=SurNodesNeg.end(); nit++) {
113 coords_nodes[0]=round(coords_nodes[0]*roundfact)/roundfact;
114 coords_nodes[1]=round(coords_nodes[1]*roundfact)/roundfact;
115 coords_nodes[2]=round(coords_nodes[2]*roundfact)/roundfact;
120 for(Range::iterator nit = SurNodesPos.begin(); nit!=SurNodesPos.end(); nit++) {
124 coords_nodes[0]=round(coords_nodes[0]*roundfact)/roundfact;
125 coords_nodes[1]=round(coords_nodes[1]*roundfact)/roundfact;
126 coords_nodes[2]=round(coords_nodes[2]*roundfact)/roundfact;
143 std::size_t found=it->getName().find(
"PotentialFlow");
144 if (found==std::string::npos)
continue;
147 cout<<
"No. of Fibres for Potential Flow : "<<noOfFibres<<endl;
149 vector<int> fibreList(noOfFibres,0);
154 std::size_t interfaceFound=it->getName().find(
"PotentialFlow_");
155 if (interfaceFound==std::string::npos)
continue;
157 std::string str2 = it->getName().substr (14,50);
159 fibreList[aaa] = atoi(str2.c_str());
177 int def_meshset_info[2] = {0,0};
178 rval = moab.tag_get_handle(
"MESHSET_INFO",2,MB_TYPE_INTEGER,th_meshset_info,MB_TAG_CREAT|MB_TAG_SPARSE,&def_meshset_info);
185 vector<BitRefLevel> bit_levels;
195 std::size_t interfaceFound=cit->getName().find(
"interface");
196 if (interfaceFound==std::string::npos)
continue;
198 ierr = PetscPrintf(PETSC_COMM_WORLD,
"Insert Interface %d\n",cit->getMeshsetId()); CHKERRQ(
ierr);
200 int meshset_data_int[2];
201 rval = moab.tag_get_data(th_meshset_info,&cubit_meshset,1,meshset_data_int);
CHKERRQ_MOAB(
rval);
202 if(meshset_data_int[1]==0){
206 ierr = m_field.get_entities_by_type_and_ref_level(bit_levels.back(),
BitRefLevel().set(),MBTET,ref_level_meshset); CHKERRQ(
ierr);
207 ierr = m_field.get_entities_by_type_and_ref_level(bit_levels.back(),
BitRefLevel().set(),MBPRISM,ref_level_meshset); CHKERRQ(
ierr);
208 Range ref_level_tets;
211 ierr = interface_ptr->
getSides(cubit_meshset,bit_levels.back(),
true); CHKERRQ(
ierr);
215 ierr = interface_ptr->
splitSides(ref_level_meshset,bit_levels.back(),cubit_meshset,
true,
true,0); CHKERRQ(
ierr);
218 int meshset_data_ins[2] = {ll,1};
219 rval = moab.tag_set_data(th_meshset_info,&cubit_meshset,1,meshset_data_ins);
CHKERRQ_MOAB(
rval);
224 ierr = m_field.update_meshset_by_entities_children(cubit_meshset,bit_levels.back(),cubit_meshset,MBVERTEX,
true); CHKERRQ(
ierr);
225 ierr = m_field.update_meshset_by_entities_children(cubit_meshset,bit_levels.back(),cubit_meshset,MBEDGE,
true); CHKERRQ(
ierr);
226 ierr = m_field.update_meshset_by_entities_children(cubit_meshset,bit_levels.back(),cubit_meshset,MBTRI,
true); CHKERRQ(
ierr);
227 ierr = m_field.update_meshset_by_entities_children(cubit_meshset,bit_levels.back(),cubit_meshset,MBTET,
true); CHKERRQ(
ierr);
233 int meshset_data_root[2]={ll,0};
239 ierr = m_field.get_entities_by_type_and_ref_level(bit_levels.back(),
BitRefLevel().set(),MBTET,out_tet_meshset); CHKERRQ(
ierr);
246 ierr = m_field.get_entities_by_type_and_ref_level(bit_levels.back(),
BitRefLevel().set(),MBPRISM,out_meshset_prism); CHKERRQ(
ierr);
252 ierr = m_field.get_entities_by_ref_level(bit_levels.back(),
BitRefLevel().set(),out_meshset); CHKERRQ(
ierr);
255 Range LatestRefinedTets;
256 rval = moab.get_entities_by_type(out_meshset, MBTET,LatestRefinedTets,
true);
CHKERRQ_MOAB(
rval);
258 Range LatestRefinedTris;
259 rval = moab.get_entities_by_type(out_meshset, MBTRI,LatestRefinedTris,
true);
CHKERRQ_MOAB(
rval);
294 if(pcomm->rank()==0) {
301 int pressure_sideset_id = 10000;
302 for (
int cc = 0; cc < noOfFibres; cc++) {
303 pressure_sideset_id=pressure_sideset_id+100;
304 ostringstream rrr, ppp1, ppp2;
305 rrr <<
"PotentialFlow_" << fibreList[cc];
308 if(it->getName() == rrr.str().c_str() ) {
312 new_tets = intersect(LatestRefinedTets,TetsInBlock);
318 Range new_tris_1, new_tris_2;
320 ppp1 <<
"PressureIO_" << fibreList[cc] <<
"_1";
321 ppp2 <<
"PressureIO_" << fibreList[cc] <<
"_2";
323 if (ppp1.str().c_str()==it->getName() || it->getMeshsetId() == pressure_sideset_id+1){
326 new_tris_1 = intersect(LatestRefinedTris,tris);
331 if (ppp2.str().c_str()==it->getName() || it->getMeshsetId() == pressure_sideset_id+2){
334 new_tris_2 = intersect(LatestRefinedTris,tris);
349 ierr = m_field.build_problems(); CHKERRQ(
ierr);
351 ierr = m_field.partition_problem(
"POTENTIAL_PROBLEM" ); CHKERRQ(
ierr);
352 ierr = m_field.partition_finite_elements(
"POTENTIAL_PROBLEM" ); CHKERRQ(
ierr);
353 ierr = m_field.partition_ghost_dofs(
"POTENTIAL_PROBLEM" ); CHKERRQ(
ierr);
355 ierr = m_field.VecCreateGhost(
"POTENTIAL_PROBLEM" ,
ROW,&
F); CHKERRQ(
ierr);
356 ierr = m_field.VecCreateGhost(
"POTENTIAL_PROBLEM" ,
COL,&
D); CHKERRQ(
ierr);
357 ierr = m_field.MatCreateMPIAIJWithArrays(
"POTENTIAL_PROBLEM" ,&A); CHKERRQ(
ierr);
360 ierr = m_field.
loop_dofs(
"MESH_NODE_POSITIONS",ent_method_material); CHKERRQ(
ierr);
362 ostringstream zero_pressure;
363 zero_pressure <<
"ZeroPressure_" << fibreList[cc];
367 if (zero_pressure.str().c_str()==it->getName()){
375 fix_nodes.insert(adj.begin(),adj.end());
377 fix_nodes.insert(adj.begin(),adj.end());
386 ierr = VecGhostUpdateBegin(
F,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
387 ierr = VecGhostUpdateEnd(
F,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
388 ierr = MatZeroEntries(A); CHKERRQ(
ierr);
392 boost::ptr_map<string,NeummanForcesSurface> neumann_forces;
393 string fe_name_str =
"FLUX_FE";
396 if (ppp1.str().c_str()==it->getName()
397 || ppp2.str().c_str()==it->getName()
398 || it->getMeshsetId()==pressure_sideset_id+1
399 || it->getMeshsetId()==pressure_sideset_id+2){
400 bool ho_geometry = m_field.
check_field(
"MESH_NODE_POSITIONS");
401 ierr = neumann_forces.at(
"FLUX_FE").addFlux(
"POTENTIAL_FIELD",
F,it->getMeshsetId(),ho_geometry); CHKERRQ(
ierr);
404 boost::ptr_map<string,NeummanForcesSurface>::iterator mit = neumann_forces.begin();
405 for(;mit!=neumann_forces.end();mit++) {
409 LaplacianElem elem(m_field,A,
F);
415 ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY); CHKERRQ(
ierr);
416 ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY); CHKERRQ(
ierr);
418 ierr = VecAssemblyBegin(
F); CHKERRQ(
ierr);
422 ierr = MatSetOption(A,MAT_SPD,PETSC_TRUE); CHKERRQ(
ierr);
425 ierr = KSPCreate(PETSC_COMM_WORLD,&solver); CHKERRQ(
ierr);
426 ierr = KSPSetOperators(solver,A,A); CHKERRQ(
ierr);
427 ierr = KSPSetFromOptions(solver); CHKERRQ(
ierr);
428 ierr = KSPSetUp(solver); CHKERRQ(
ierr);
431 ierr = VecGhostUpdateBegin(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
432 ierr = VecGhostUpdateEnd(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
433 ierr = m_field.set_global_ghost_vector(
"POTENTIAL_PROBLEM",
ROW,
D,INSERT_VALUES,SCATTER_REVERSE); CHKERRQ(
ierr);
435 if(pcomm->rank()==0) {
448 ierr = MatDestroy(&A); CHKERRQ(
ierr);
449 ierr = KSPDestroy(&solver); CHKERRQ(
ierr);
455 rval = moab.tag_get_handle(
"PHI",1,MB_TYPE_DOUBLE,th_phi,MB_TAG_CREAT|MB_TAG_SPARSE,&def_val);
CHKERRQ_MOAB(
rval);
458 double val = dof->get()->getFieldData();
463 ierr = m_field.
loop_dofs(
"POTENTIAL_FIELD",ent_method_phi_on_10nodeTet); CHKERRQ(
ierr);
464 ent_method_phi_on_10nodeTet.
setNodes =
false;
465 ierr = m_field.
loop_dofs(
"POTENTIAL_FIELD",ent_method_phi_on_10nodeTet); CHKERRQ(
ierr);
467 if(pcomm->rank()==0) {
471 if(pcomm->rank()==0) {
472 rval = moab.write_file(
"out_potential_flow.vtk",
"VTK",
"",&out_meshset_fibres,1);
CHKERRQ_MOAB(
rval);