| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -361,6 +361,10 @@ namespace ssim { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#endif | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        for (int dofI = 0; dofI < nDof; ++dofI) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            linSysSolver->addCoeff(dofI, dofI, 1e-5); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    void StaticSim::solve() { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -470,6 +474,63 @@ namespace ssim { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // BC only apply on surface nodes
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // void StaticSim::setBC() {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     spdlog::info("set Boundary Conditions");
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     // DBC
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     int nDBC = 0;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     DBC_nI.resize(nN);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     isDBC.setZero(nN);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     int DBCNum = (int) DirichletBCs.size();
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     for (int svI = 0; svI < SVI.size(); ++svI) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //         int vI = SVI(svI);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //         Eigen::Vector3d p = TV.row(vI);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //         for (int _i = 0; _i < DBCNum; ++_i) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //             if (DirichletBCs[_i].inDBC(p)) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //                 DBC_nI(nDBC) = vI;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //                 isDBC(vI) = 1;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //                 ++nDBC;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //                 break;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //             }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //         }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     DBC_nI.conservativeResize(nDBC);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     // Utils::writeOBJ(outputPath + "DBCV.obj", TV(DBC_nI, Eigen::all),
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     //                 Eigen::VectorXi::LinSpaced(nDBC, 0, nDBC-1));
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     // NBC
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     load.resize(0);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     load.setZero(nDof);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     int nNBC = 0;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     Eigen::VectorXi NBC_nI(nN);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     int NBCNum = (int) NeumannBCs.size();
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     for (int svI = 0; svI < SVI.size(); ++svI) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //         int vI = SVI(svI);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //         Eigen::Vector3d p = TV.row(vI);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //         for (int _i = 0; _i < NBCNum; ++_i) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //             if (NeumannBCs[_i].inNBC(p)) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //                 load.segment<DIM_>(vI * DIM_) = NeumannBCs[_i].force;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //                 NBC_nI(nNBC) = vI;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //                 ++nNBC;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //                 break;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //             }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //         }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     NBC_nI.conservativeResize(nNBC);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     // Utils::writeOBJ(outputPath + "NBCV.obj", TV(NBC_nI, Eigen::all),
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     //                 Eigen::VectorXi::LinSpaced(nNBC, 0, nNBC-1));
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     spdlog::info("#DBC nodes: {}, #NBC particles: {}", nDBC, nNBC);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     // ensure (DBC intersect NBC) = (empty)
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     for (int i_ = 0; i_ < DBC_nI.size(); ++i_) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //         int nI = DBC_nI(i_);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //         load.segment<DIM_>(nI * DIM_).setZero();
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    //     }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    Model StaticSim::get_mesh() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (mesh_.NumVertex() == 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // fill mesh_
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |