| 
						
						
							
								
							
						
						
					 | 
					@ -37,20 +37,14 @@ bool keepQuadraturePoint(std::vector<tensor3>& originTensors, const uvector3& or | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return true; | 
					 | 
					 | 
					    return true; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					class BasicTask | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					public: | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					// std::vector<std::shared_ptr<PrimitiveDesc>> primitives;
 | 
					 | 
					 | 
					// std::vector<std::shared_ptr<PrimitiveDesc>> primitives;
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					// BasicTask(std::vector<std::shared_ptr<PrimitiveDesc>> ps) {};
 | 
					 | 
					 | 
					// BasicTask(std::vector<std::shared_ptr<PrimitiveDesc>> ps) {};
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    BasicTask(std::shared_ptr<PrimitiveDesc> p) | 
					 | 
					 | 
					void basicTask(const std::shared_ptr<PrimitiveDesc>& p, int q = 20, real xmin = -1, real xmax = 1) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        int      q         = 20; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    real     volume    = 0; | 
					 | 
					 | 
					    real     volume    = 0; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        real     xmin      = -1; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        real     xmax      = 1; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    auto     integrand = [](const uvector<real, 3>& x) { return 1.0; }; | 
					 | 
					 | 
					    auto     integrand = [](const uvector<real, 3>& x) { return 1.0; }; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    uvector3 range     = xmax - xmin; | 
					 | 
					 | 
					    uvector3 range     = xmax - xmin; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -113,31 +107,32 @@ public: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    std::cout << "Volume xxx: " << volume << std::endl; | 
					 | 
					 | 
					    std::cout << "Volume xxx: " << volume << std::endl; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					}; | 
					 | 
					 | 
					}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    BasicTask(std::vector<std::shared_ptr<PrimitiveDesc>> primitives) | 
					 | 
					 | 
					void basicTask(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitives, int q = 20, real xmin = -1, real xmax = 1) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    std::vector<SparkStack<real>*> phiStacks; | 
					 | 
					 | 
					    std::vector<SparkStack<real>*> phiStacks; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    std::vector<tensor3>           phis; | 
					 | 
					 | 
					    std::vector<tensor3>           phis; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    std::vector<SparkStack<real>*> originTensorStacks; | 
					 | 
					 | 
					    std::vector<SparkStack<real>*> originTensorStacks; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    std::vector<tensor3>           originTensors; | 
					 | 
					 | 
					    std::vector<tensor3>           originTensors; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        int                            q = 10; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    real                           volume; | 
					 | 
					 | 
					    real                           volume; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        uvector3                       xmin      = 0; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        uvector3                       xmax      = 1; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    auto                           integrand = [](const uvector<real, 3>& x) { return 1.0; }; | 
					 | 
					 | 
					    auto                           integrand = [](const uvector<real, 3>& x) { return 1.0; }; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    uvector3                       range     = xmax - xmin; | 
					 | 
					 | 
					    uvector3                       range     = xmax - xmin; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					
 | 
					 | 
					 | 
					    uvector<real, 3>               testX(0., 0.75, 0.2); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					    for (int i = 0; i < primitives.size(); i++) { | 
					 | 
					 | 
					    for (int i = 0; i < primitives.size(); i++) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        if (auto pt = std::dynamic_pointer_cast<SphereDesc>(primitives[i])) { | 
					 | 
					 | 
					        if (auto pt = std::dynamic_pointer_cast<SphereDesc>(primitives[i])) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            tensor3 originTensor(nullptr, 3), transformedTensor(nullptr, 3); | 
					 | 
					 | 
					            tensor3 originTensor(nullptr, 3), transformedTensor(nullptr, 3); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            originTensorStacks.emplace_back(algoim_spark_alloc_heap(real, originTensor)); // 记录,用以最后bool
 | 
					 | 
					 | 
					            originTensorStacks.emplace_back(algoim_spark_alloc_heap(real, originTensor)); // 记录,用以最后bool
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            tensor3 phi(nullptr, 3); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            phiStacks.emplace_back( | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                algoim_spark_alloc_heap(real, phi)); // 必须先于algoim_spark_alloc,使transformedTensor的内存以栈形式释放
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            algoim_spark_alloc(real, transformedTensor); | 
					 | 
					 | 
					            algoim_spark_alloc(real, transformedTensor); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            makeSphere(*pt, originTensor); | 
					 | 
					 | 
					            makeSphere(*pt, originTensor); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            originTensors.emplace_back(originTensor); | 
					 | 
					 | 
					            originTensors.emplace_back(originTensor); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            detail::powerTransformation(range, xmin, originTensor, transformedTensor); | 
					 | 
					 | 
					            detail::powerTransformation(range, xmin, originTensor, transformedTensor); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					                tensor3 phi(nullptr, 3); | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					                phiStacks.emplace_back(algoim_spark_alloc_heap(real, phi)); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					            detail::power2BernsteinTensor(transformedTensor, phi); | 
					 | 
					 | 
					            detail::power2BernsteinTensor(transformedTensor, phi); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            phis.emplace_back(phi); | 
					 | 
					 | 
					            phis.emplace_back(phi); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        } else if (auto pt = std::dynamic_pointer_cast<MeshDesc>(primitives[i])) { | 
					 | 
					 | 
					        } else if (auto pt = std::dynamic_pointer_cast<MeshDesc>(primitives[i])) { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -146,29 +141,41 @@ public: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            std::vector<tensor3> planeTensors(faceCount, tensor3(nullptr, 2)); | 
					 | 
					 | 
					            std::vector<tensor3> planeTensors(faceCount, tensor3(nullptr, 2)); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            algoimSparkAllocHeapVector(originTensorStacks, planeTensors); | 
					 | 
					 | 
					            algoimSparkAllocHeapVector(originTensorStacks, planeTensors); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            tensor3 phi(nullptr, 1 + faceCount); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            phiStacks.emplace_back( | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                algoim_spark_alloc_heap(real, phi)); // 必须先于algoim_spark_alloc,使compositeTensor的内存以栈形式释放
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            tensor3 compositeTensor(nullptr, 1 + faceCount); | 
					 | 
					 | 
					            tensor3 compositeTensor(nullptr, 1 + faceCount); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            algoim_spark_alloc(real, compositeTensor); | 
					 | 
					 | 
					            algoim_spark_alloc(real, compositeTensor); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            makeMesh(*pt, compositeTensor, planeTensors); | 
					 | 
					 | 
					            makeMesh(*pt, compositeTensor, planeTensors); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            detail::powerTransformation(range, xmin, compositeTensor); | 
					 | 
					 | 
					            detail::powerTransformation(range, xmin, compositeTensor); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            real testEvalPower = evalPower(compositeTensor, testX); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            originTensors.insert(originTensors.end(), planeTensors.begin(), planeTensors.end()); | 
					 | 
					 | 
					            originTensors.insert(originTensors.end(), planeTensors.begin(), planeTensors.end()); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                tensor3 phi(nullptr, 1 + faceCount); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                phiStacks.emplace_back(algoim_spark_alloc_heap(real, phi)); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            detail::power2BernsteinTensor(compositeTensor, phi); | 
					 | 
					 | 
					            detail::power2BernsteinTensor(compositeTensor, phi); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            real testEvalBernstein = bernstein::evalBernsteinPoly(phi, testX); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            phis.emplace_back(phi); | 
					 | 
					 | 
					            phis.emplace_back(phi); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        } | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    real                      testEvalBernstein = bernstein::evalBernsteinPoly(phis[0], testX); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    ImplicitPolyQuadrature<3> ipquad(phis); | 
					 | 
					 | 
					    ImplicitPolyQuadrature<3> ipquad(phis); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    ipquad.integrate(AutoMixed, q, [&](const uvector<real, 3>& x, real w) { | 
					 | 
					 | 
					    ipquad.integrate(AutoMixed, q, [&](const uvector<real, 3>& x, real w) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        auto realX = x * range + xmin; | 
					 | 
					 | 
					        auto realX = x * range + xmin; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        if (keepQuadraturePoint(originTensors, realX)) volume += w * integrand(realX); | 
					 | 
					 | 
					        if (keepQuadraturePoint(originTensors, realX)) volume += w * integrand(realX); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    }); | 
					 | 
					 | 
					    }); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    volume *= pow(xmax - xmin, 3); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    std::cout << "Volume xxx: " << volume << std::endl; | 
					 | 
					 | 
					    std::cout << "Volume xxx: " << volume << std::endl; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					        // free memory
 | 
					 | 
					 | 
					    // free memory, thus deallocate memory of xarray
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					    for (auto& p : phiStacks) delete p; | 
					 | 
					 | 
					    for (auto& p : phiStacks) delete p; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    for (auto& p : originTensorStacks) delete p; | 
					 | 
					 | 
					    for (auto& p : originTensorStacks) delete p; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					}; | 
					 | 
					 | 
					}; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					}; | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					void quadratureTask(const Scene& scene) {} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					void buildOctree(const Scene& scene, std::vector<Node>& nodes, const uvector3& min, const uvector3& max) {} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					}; // namespace algoim::Organizer
 | 
					 | 
					 | 
					}; // namespace algoim::Organizer
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					
  |