From 6ed3893f3ee4201ddb9aa0de6272f2a284a2aae9 Mon Sep 17 00:00:00 2001 From: eugenio aulisa Date: Mon, 30 Mar 2015 07:35:17 -0500 Subject: [PATCH 01/19] FSI3 working --- .../input/gambit/turek_FSI3.dbs | Bin 0 -> 208896 bytes .../input/turek_FSI3.neu | 1629 +++++++++++++++++ .../FSI/FSITimeDependentBenchmarks/main.cpp | 31 +- ...IncompressibleFSIAssemblyTimeDependent.hpp | 1 - 4 files changed, 1652 insertions(+), 9 deletions(-) create mode 100644 applications/FSI/FSITimeDependentBenchmarks/input/gambit/turek_FSI3.dbs create mode 100644 applications/FSI/FSITimeDependentBenchmarks/input/turek_FSI3.neu diff --git a/applications/FSI/FSITimeDependentBenchmarks/input/gambit/turek_FSI3.dbs b/applications/FSI/FSITimeDependentBenchmarks/input/gambit/turek_FSI3.dbs new file mode 100644 index 0000000000000000000000000000000000000000..55c84e70af0e47788952a325ec3c4ec165040db3 GIT binary patch literal 208896 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[2*dim],indexVAR[2*dim],inode); Soli[indexVAR[2*dim]][i] = (*mysolution->_Sol[indVAR[2*dim]])(inode_Metis); Soli_old[indexVAR[2*dim]][i] = (*mysolution->_SolOld[indVAR[2*dim]])(inode_Metis); - //std::cout< Date: Mon, 30 Mar 2015 14:38:55 -0500 Subject: [PATCH 02/19] added AD assembly in Ex2 --- .../NumPdeSpring2015/Eugenio/Ex2/Ex2.cpp | 227 +++++++++++++++++- 1 file changed, 223 insertions(+), 4 deletions(-) diff --git a/applications/NumPdeSpring2015/Eugenio/Ex2/Ex2.cpp b/applications/NumPdeSpring2015/Eugenio/Ex2/Ex2.cpp index 92de22dc0..8dd3eb86e 100644 --- a/applications/NumPdeSpring2015/Eugenio/Ex2/Ex2.cpp +++ b/applications/NumPdeSpring2015/Eugenio/Ex2/Ex2.cpp @@ -14,6 +14,8 @@ #include "VTKWriter.hpp" #include "GMVWriter.hpp" #include "LinearImplicitSystem.hpp" +#include "adept.h" + using namespace femus; @@ -27,6 +29,10 @@ bool SetBoundaryCondition(const double &x, const double &y, const double &z,cons void AssemblePoissonProblem(MultiLevelProblem &ml_prob, unsigned level, const unsigned &levelMax, const bool &assembleMatrix); +void AssemblePoissonProblem_AD(MultiLevelProblem &ml_prob, unsigned level, const unsigned &levelMax, const bool &assembleMatrix); + + + std::pair < double, double > GetErrorNorm(MultiLevelSolution *mlSol); int main(int argc, char **args) { @@ -39,17 +45,17 @@ int main(int argc, char **args) { MultiLevelMesh mlMsh; // read coarse level mesh and generate finers level meshes double scalingFactor=1.; - mlMsh.ReadCoarseMesh("./input/cube_mixed.neu","seventh",scalingFactor); + mlMsh.ReadCoarseMesh("./input/square_quad.neu","seventh",scalingFactor); /* "seventh" is the order of accuracy that is used in the gauss integration scheme probably in the furure it is not going to be an argument of this function */ unsigned dim = mlMsh.GetDimension(); unsigned maxNumberOfMeshes; if(dim==2){ - maxNumberOfMeshes = 7; + maxNumberOfMeshes = 5; } else{ - maxNumberOfMeshes = 5; + maxNumberOfMeshes = 4; } vector < vector < double > > l2Norm; @@ -96,7 +102,7 @@ int main(int argc, char **args) { system.AddSolutionToSystemPDE("u"); // attach the assembling function to system - system.SetAssembleFunction(AssemblePoissonProblem); + system.SetAssembleFunction(AssemblePoissonProblem_AD); // initilaize and solve the system system.init(); @@ -346,9 +352,222 @@ void AssemblePoissonProblem(MultiLevelProblem &ml_prob, unsigned level, const un RES->close(); if( assembleMatrix ) KK->close(); // ***************** END ASSEMBLY ******************* +} + + + +/** + * This function assemble the stiffnes matrix KK and the residual vector Res + * Using automatic divverentiation for Newton iterative scheme + * J(u0) w = - F(u0) , + * with u = u0 + w + * F = KK u - f(x) = Res + * J = \grad_u F = KK + * + * thus + * KK w = f(x) - KK u0 + **/ +void AssemblePoissonProblem_AD(MultiLevelProblem &ml_prob, unsigned level, const unsigned &levelMax, const bool &assembleMatrix) { + // ml_prob is the global object from/to where get/set all the data + // level is the level of the PDE system to be assembled + // levelMax is the Maximum level of the MultiLevelProblem + // assembleMatrix is a flag that tells if only the residual or also the matrix should be assembled + + // call the adept stack object + adept::Stack & s = FemusInit::_adeptStack; + // extract pointers to the several objects that we are going to use + Mesh* msh = ml_prob._ml_msh->GetLevel(level); // pointer to the mesh (level) object + elem* el = msh->el; // pointer to the elem object in msh (level) + + MultiLevelSolution* mlSol = ml_prob._ml_sol; // pointer to the multilevel solution object + Solution* sol = ml_prob._ml_sol->GetSolutionLevel(level); // pointer to the solution (level) object + + LinearImplicitSystem* mlPdeSys = &ml_prob.get_system("Poisson"); // pointer to the linear implicit system named "Poisson" + LinearEquationSolver* pdeSys = mlPdeSys->_LinSolver[level]; // pointer to the equation (level) object + SparseMatrix* KK = pdeSys->_KK; // pointer to the global stifness matrix object in pdeSys (level) + NumericVector* RES = pdeSys->_RES; // pointer to the global residual vector object in pdeSys (level) + + const unsigned dim = msh->GetDimension(); // get the domain dimension of the problem + unsigned iproc = msh->processor_id(); // get the process_id (for parallel computation) + + //solution variable + unsigned soluIndex; + soluIndex = mlSol->GetIndex("u"); // get the position of "u" in the ml_sol object + unsigned soluType = mlSol->GetSolutionType(soluIndex); // get the finite element type for "u" + + unsigned soluPdeIndex; + soluPdeIndex = mlPdeSys->GetSolPdeIndex("u"); // get the position of "u" in the pdeSys object + + vector < adept::adouble > solu; // local solution + + vector < vector < double > > x(dim); // local coordinates + unsigned xType = 2; // get the finite element type for "x", it is always 2 (LAGRANGE QUADRATIC) + + vector< int > KKDof; // local to global pdeSys dofs + vector phi; // local test function + vector phi_x; // local test function first order partial derivatives + vector phi_xx; // local test function second order partial derivatives + double weight; // gauss point weight + + vector< double > Res; // local redidual vector + vector< adept::adouble > aRes; // local redidual vector + vector< double > K; // local stiffness matrix + + // reserve memory for the local standar vectors + const unsigned maxSize = static_cast< unsigned > (ceil(pow(3,dim))); // conservative: based on line3, quad9, hex27 + solu.reserve(maxSize); + for(unsigned i = 0; i < dim; i++) + x[i].reserve(maxSize); + KKDof.reserve(maxSize); + phi.reserve(maxSize); + phi_x.reserve(maxSize*dim); + unsigned dim2=(3*(dim-1)+!(dim-1)); // dim2 is the number of second order partial derivatives (1,3,6 depending on the dimension) + phi_xx.reserve(maxSize*dim2); + Res.reserve(maxSize); + aRes.reserve(maxSize); + K.reserve(maxSize*maxSize); + + vector < double > Jac; + Jac.reserve(maxSize*maxSize); + + if( assembleMatrix ) + KK->zero(); // Set to zero all the entries of the Global Matrix + + // element loop: each process loops only on the elements that owns + for (int iel=msh->IS_Mts2Gmt_elem_offset[iproc]; iel < msh->IS_Mts2Gmt_elem_offset[iproc+1]; iel++) { + + unsigned kel = msh->IS_Mts2Gmt_elem[iel]; // mapping between paralell dof and mesh dof + short unsigned kelGeom = el->GetElementType( kel ); // element geometry type + unsigned nDofs = el->GetElementDofNumber( kel, soluType); // number of solution element dofs + unsigned nDofs2 = el->GetElementDofNumber( kel, xType); // number of coordinate element dofs + + // resize local arrays + KKDof.resize(nDofs); + solu.resize(nDofs); + for(int i=0; iGetMeshDof(kel, i, soluType); // local to global solution node + unsigned solDof = msh->GetMetisDof(iNode, soluType); // global to global mapping between solution node and solution dof + solu[i] = (*sol->_Sol[soluIndex])(solDof); // global extraction and local storage for the solution + KKDof[i] = pdeSys->GetKKDof(soluIndex, soluPdeIndex, iNode); // global to global mapping between solution node and pdeSys dof + } + + // local storage of coordinates + for( unsigned i=0; iGetMeshDof(kel, i, xType); // local to global coordinates node + unsigned xDof = msh->GetMetisDof(iNode, xType); // global to global mapping between coordinates node and coordinate dof + for(unsigned jdim=0; jdim_coordinate->_Sol[jdim])(xDof); // global extraction and local storage for the element coordinates + } + } + + if( level == levelMax || !el->GetRefinedElementIndex(kel)) { // do not care about this if now (it is used for the AMR) + // start a new recording of all the operations involving adept::adouble variables + s.new_recording(); + + // *** Gauss point loop *** + for(unsigned ig=0; ig < msh->_finiteElement[kelGeom][soluType]->GetGaussPointNumber(); ig++) { + // *** get gauss point weight, test function and test function partial derivatives *** + msh->_finiteElement[kelGeom][soluType]->Jacobian(x,ig,weight,phi,phi_x,phi_xx); + + // evaluate the solution, the solution derivatives and the coordinates in the gauss point + adept::adouble soluGauss = 0; + vector < adept::adouble > soluGauss_x(dim,0.); + vector < double > xGauss(dim,0.); + + for(unsigned i=0; iadd_vector_blocked(Res,KKDof); + + if(assembleMatrix) { + + // define the dependent variables + s.dependent(&aRes[0], nDofs); + + // define the independent variables + s.independent(&solu[0], nDofs); + + // get the jacobian matrix (ordered by column) + s.jacobian(&Jac[0]); + + // get the jacobian matrix (ordered by raw, i.e. K=Jac^t) + for (int inode=0;inodeadd_matrix_blocked(K,KKDof,KKDof); + } + } //end element loop for each process + + RES->close(); + if( assembleMatrix ) KK->close(); + // ***************** END ASSEMBLY ******************* } + + + + + + + + + + + + + + + + + + + + std::pair < double, double > GetErrorNorm(MultiLevelSolution *mlSol){ unsigned level = mlSol->_ml_msh->GetNumberOfLevels()-1u; From 3813618ead3f6898cba9762f885475f5c77fe521 Mon Sep 17 00:00:00 2001 From: eaulisa Date: Mon, 30 Mar 2015 16:25:17 -0500 Subject: [PATCH 03/19] fixed ossteram --- .../NumPdeSpring2015/Eugenio/Ex2/Ex2.cpp | 166 +++++++++++++++++- src/solution/MultiLevelSolution.cpp | 3 +- 2 files changed, 166 insertions(+), 3 deletions(-) diff --git a/applications/NumPdeSpring2015/Eugenio/Ex2/Ex2.cpp b/applications/NumPdeSpring2015/Eugenio/Ex2/Ex2.cpp index 8dd3eb86e..10f3dd999 100644 --- a/applications/NumPdeSpring2015/Eugenio/Ex2/Ex2.cpp +++ b/applications/NumPdeSpring2015/Eugenio/Ex2/Ex2.cpp @@ -31,6 +31,7 @@ void AssemblePoissonProblem(MultiLevelProblem &ml_prob, unsigned level, const un void AssemblePoissonProblem_AD(MultiLevelProblem &ml_prob, unsigned level, const unsigned &levelMax, const bool &assembleMatrix); +void AssemblePoissonProblem_AD_mine(MultiLevelProblem &ml_prob, unsigned level, const unsigned &levelMax, const bool &assembleMatrix); std::pair < double, double > GetErrorNorm(MultiLevelSolution *mlSol); @@ -102,7 +103,7 @@ int main(int argc, char **args) { system.AddSolutionToSystemPDE("u"); // attach the assembling function to system - system.SetAssembleFunction(AssemblePoissonProblem_AD); + system.SetAssembleFunction(AssemblePoissonProblem_AD_mine); // initilaize and solve the system system.init(); @@ -355,6 +356,161 @@ void AssemblePoissonProblem(MultiLevelProblem &ml_prob, unsigned level, const un } +void AssemblePoissonProblem_AD_mine(MultiLevelProblem &ml_prob, unsigned level, const unsigned &levelMax, const bool &assembleMatrix) { + // ml_prob is the global object from/to where get/set all the data + // level is the level of the PDE system to be assembled + // levelMax is the Maximum level of the MultiLevelProblem + // assembleMatrix is a flag that tells if only the residual or also the matrix should be assembled + + // extract pointers to the several objects that we are going to use + Mesh* msh = ml_prob._ml_msh->GetLevel(level); // pointer to the mesh (level) object + elem* el = msh->el; // pointer to the elem object in msh (level) + + MultiLevelSolution* mlSol = ml_prob._ml_sol; // pointer to the multilevel solution object + Solution* sol = ml_prob._ml_sol->GetSolutionLevel(level); // pointer to the solution (level) object + + LinearImplicitSystem* mlPdeSys = &ml_prob.get_system("Poisson"); // pointer to the linear implicit system named "Poisson" + LinearEquationSolver* pdeSys = mlPdeSys->_LinSolver[level]; // pointer to the equation (level) object + SparseMatrix* KK = pdeSys->_KK; // pointer to the global stifness matrix object in pdeSys (level) + NumericVector* RES = pdeSys->_RES; // pointer to the global residual vector object in pdeSys (level) + + const unsigned dim = msh->GetDimension(); // get the domain dimension of the problem + unsigned iproc = msh->processor_id(); // get the process_id (for parallel computation) + + //solution variable + unsigned soluIndex; + soluIndex = mlSol->GetIndex("u"); // get the position of "u" in the ml_sol object + unsigned soluType = mlSol->GetSolutionType(soluIndex); // get the finite element type for "u" + + unsigned soluPdeIndex; + soluPdeIndex = mlPdeSys->GetSolPdeIndex("u"); // get the position of "u" in the pdeSys object + + vector < double > solu; // local solution + + vector < vector < double > > x(dim); // local coordinates + unsigned xType = 2; // get the finite element type for "x", it is always 2 (LAGRANGE QUADRATIC) + + vector< int > KKDof; // local to global pdeSys dofs + vector phi; // local test function + vector phi_x; // local test function first order partial derivatives + vector phi_xx; // local test function second order partial derivatives + double weight; // gauss point weight + + vector< double > Res; // local redidual vector + vector< double > K; // local stiffness matrix + + // reserve memory for the local standar vectors + const unsigned maxSize = static_cast< unsigned > (ceil(pow(3,dim))); // conservative: based on line3, quad9, hex27 + solu.reserve(maxSize); + for(unsigned i = 0; i < dim; i++) + x[i].reserve(maxSize); + KKDof.reserve(maxSize); + phi.reserve(maxSize); + phi_x.reserve(maxSize*dim); + unsigned dim2=(3*(dim-1)+!(dim-1)); // dim2 is the number of second order partial derivatives (1,3,6 depending on the dimension) + phi_xx.reserve(maxSize*dim2); + Res.reserve(maxSize); + K.reserve(maxSize*maxSize); + + if( assembleMatrix ) + KK->zero(); // Set to zero all the entries of the Global Matrix + + // element loop: each process loops only on the elements that owns + for (int iel=msh->IS_Mts2Gmt_elem_offset[iproc]; iel < msh->IS_Mts2Gmt_elem_offset[iproc+1]; iel++) { + + unsigned kel = msh->IS_Mts2Gmt_elem[iel]; // mapping between paralell dof and mesh dof + short unsigned kelGeom = el->GetElementType( kel ); // element geometry type + unsigned nDofs = el->GetElementDofNumber( kel, soluType); // number of solution element dofs + unsigned nDofs2 = el->GetElementDofNumber( kel, xType); // number of coordinate element dofs + + // resize local arrays + KKDof.resize(nDofs); + solu.resize(nDofs); + for(int i=0; iGetMeshDof(kel, i, soluType); // local to global solution node + unsigned solDof = msh->GetMetisDof(iNode, soluType); // global to global mapping between solution node and solution dof + solu[i] = (*sol->_Sol[soluIndex])(solDof); // global extraction and local storage for the solution + KKDof[i] = pdeSys->GetKKDof(soluIndex, soluPdeIndex, iNode); // global to global mapping between solution node and pdeSys dof + } + + // local storage of coordinates + for( unsigned i=0; iGetMeshDof(kel, i, xType); // local to global coordinates node + unsigned xDof = msh->GetMetisDof(iNode, xType); // global to global mapping between coordinates node and coordinate dof + for(unsigned jdim=0; jdim_coordinate->_Sol[jdim])(xDof); // global extraction and local storage for the element coordinates + } + } + + if( level == levelMax || !el->GetRefinedElementIndex(kel)) { // do not care about this if now (it is used for the AMR) + // *** Gauss point loop *** + for(unsigned ig=0; ig < msh->_finiteElement[kelGeom][soluType]->GetGaussPointNumber(); ig++) { + // *** get gauss point weight, test function and test function partial derivatives *** + msh->_finiteElement[kelGeom][soluType]->Jacobian(x,ig,weight,phi,phi_x,phi_xx); + + // evaluate the solution, the solution derivatives and the coordinates in the gauss point + double soluGauss = 0; + vector < double > soluGauss_x(dim,0.); + vector < double > xGauss(dim,0.); + + for(unsigned i=0; iadd_vector_blocked(Res,KKDof); + if(assembleMatrix) KK->add_matrix_blocked(K,KKDof,KKDof); + } //end element loop for each process + + RES->close(); + if( assembleMatrix ) KK->close(); + // ***************** END ASSEMBLY ******************* +} + + + + /** @@ -362,12 +518,13 @@ void AssemblePoissonProblem(MultiLevelProblem &ml_prob, unsigned level, const un * Using automatic divverentiation for Newton iterative scheme * J(u0) w = - F(u0) , * with u = u0 + w - * F = KK u - f(x) = Res + * - F = f(x) - KK u = Res * J = \grad_u F = KK * * thus * KK w = f(x) - KK u0 **/ + void AssemblePoissonProblem_AD(MultiLevelProblem &ml_prob, unsigned level, const unsigned &levelMax, const bool &assembleMatrix) { // ml_prob is the global object from/to where get/set all the data // level is the level of the PDE system to be assembled @@ -375,6 +532,8 @@ void AssemblePoissonProblem_AD(MultiLevelProblem &ml_prob, unsigned level, const // assembleMatrix is a flag that tells if only the residual or also the matrix should be assembled // call the adept stack object + + adept::Stack & s = FemusInit::_adeptStack; // extract pointers to the several objects that we are going to use @@ -541,6 +700,9 @@ void AssemblePoissonProblem_AD(MultiLevelProblem &ml_prob, unsigned level, const } //store K in the global matrix KK KK->add_matrix_blocked(K,KKDof,KKDof); + + s.clear_independents(); + s.clear_dependents(); } } //end element loop for each process diff --git a/src/solution/MultiLevelSolution.cpp b/src/solution/MultiLevelSolution.cpp index b7d597172..18f1973fc 100644 --- a/src/solution/MultiLevelSolution.cpp +++ b/src/solution/MultiLevelSolution.cpp @@ -24,10 +24,11 @@ PURPOSE. See the above copyright notice for more information. #include "ParsedFunction.hpp" + //C++ include #include #include - +#include namespace femus { From dbebe583f804e474491951d75cb738a3edd17b15 Mon Sep 17 00:00:00 2001 From: eaulisa Date: Tue, 31 Mar 2015 16:15:39 -0500 Subject: [PATCH 04/19] added bathe fsi 2d time dependent --- .../FSI/FSITimeDependentBenchmarks/main.cpp | 162 ++++++++++-------- ...IncompressibleFSIAssemblyTimeDependent.hpp | 11 +- src/equations/TransientSystem.hpp | 5 + 3 files changed, 106 insertions(+), 72 deletions(-) diff --git a/applications/FSI/FSITimeDependentBenchmarks/main.cpp b/applications/FSI/FSITimeDependentBenchmarks/main.cpp index 7545b96be..3a2890ea1 100644 --- a/applications/FSI/FSITimeDependentBenchmarks/main.cpp +++ b/applications/FSI/FSITimeDependentBenchmarks/main.cpp @@ -34,6 +34,8 @@ bool SetRefinementFlag(const double &x, const double &y, const double &z, const double SetVariableTimeStep(const double time); //------------------------------------------------------------------------------------------------------------------ +unsigned turek_FSI = 0; +unsigned simulation; int main(int argc,char **args) { @@ -45,50 +47,62 @@ int main(int argc,char **args) { //files.RedirectCout(); // ******* Extract the problem dimension and simulation identifier based on the inline input ******* - unsigned simulation; + bool dimension2D; if(argc >= 2) { - if( !strcmp("turek_2D_FSI",args[1])) { /** FSI steady-state Turek benchmark */ - simulation=1; - dimension2D=1; + if( !strcmp("turek_2D_FSI1",args[1])) { /** FSI steady-state Turek benchmark */ + turek_FSI = 1; + simulation = 1; + dimension2D = 1; + } + else if( !strcmp("turek_2D_FSI2",args[1])) { /** FSI steady-state Turek benchmark */ + turek_FSI = 2; + simulation = 1; + dimension2D = 1; + } + else if( !strcmp("turek_2D_FSI3",args[1])) { /** FSI steady-state Turek benchmark */ + turek_FSI = 3; + simulation = 1; + dimension2D = 1; } else if( !strcmp("turek_2D_solid",args[1])) { /** Solid Turek beam benchmark test. Beware: activate gravity in assembly */ - simulation=2; - dimension2D=1; + turek_FSI = 1; + simulation = 2; + dimension2D = 1; } else if( !strcmp("bathe_2D_FSI",args[1])){ /** Bathe 2D membrane benchmark */ - simulation=3; - dimension2D=1; + simulation = 3; + dimension2D = 1; } else if( !strcmp("bathe_3D_FSI",args[1])){ /** Bathe 3D cylinder FSI benchmark */ - simulation=4; - dimension2D=0; + simulation = 4; + dimension2D = 0; } else if( !strcmp("bathe_3D_solid",args[1])) { /** Bathe 3D solid, for debugging */ - simulation=5; - dimension2D=0; + simulation = 5; + dimension2D = 0; } else if( !strcmp("bathe_3D_fluid",args[1])) { /** Bathe 3D fluid, for debugging */ - simulation=6; - dimension2D=0; + simulation = 6; + dimension2D = 0; } else if( !strcmp("comsol_2D_FSI",args[1])) { /** Comsol 2D vertical beam benchmark */ - simulation=7; - dimension2D=1; + simulation = 7; + dimension2D = 1; } else{ cout << "wrong input arguments!\n"; cout << "please specify the simulation you want to run, options are\n"; - cout << "turek_2D_FSI \n turek_2D_solid \n bathe_2D_FSI \n bathe_3D_FSI \n bathe_3D_solid \n bathe_3D_fluid \n comsol_2D_FSI \n"; + cout << "turek_2D_FSI1 \n turek_2D_FSI2 \n turek_2D_FSI3 \n turek_2D_solid \n bathe_2D_FSI \n bathe_3D_FSI \n bathe_3D_solid \n bathe_3D_fluid \n comsol_2D_FSI \n"; abort(); } } else { cout << "no input arguments!\n"; cout << "please specify the simulation you want to run, options are\n"; - cout << "turek_2D_FSI \n turek_2D_solid \n bathe_2D_FSI \n bathe_3D_FSI \n bathe_3D_solid \n bathe_3D_fluid \n comsol_2D_FSI \n"; + cout << "turek_2D_FSI1 \n turek_2D_FSI2 \n turek_2D_FSI3 \n turek_2D_solid \n bathe_2D_FSI \n bathe_3D_FSI \n bathe_3D_solid \n bathe_3D_fluid \n comsol_2D_FSI \n"; abort(); } @@ -143,40 +157,33 @@ int main(int argc,char **args) { Uref = 1.; if(simulation<3){ //turek 2D -// //Turek-Hron FSI1 -// rhof = 1000.; -// muf = 1.; -// rhos = 1000.; -// ni = 0.5; -// E = 1400000; - -// //Turek-Hron FSI2 -// rhof = 1000.; -// muf = 1.; -// rhos = 10000.; -// ni = 0.5; -// E = 1400000; - - //Turek-Hron FSI3 - rhof = 1000.; - muf = 1.; - rhos = 1000.; - ni = 0.5; - E = 5600000; - - /* - rhof = 1000.; - muf = 1.; - rhos = 1000; - ni = 0.5; - E = 1400000; */ + //Turek-Hron FSI1 + rhof = 1000.; + muf = 1.; + rhos = 1000.; + ni = 0.5; + E = 1400000; + if(turek_FSI == 2){ //Turek-Hron FSI2 + rhof = 1000.; + muf = 1.; + rhos = 10000.; + ni = 0.5; + E = 1400000; + } + else if (turek_FSI == 3){ //Turek-Hron FSI3 + rhof = 1000.; + muf = 1.; + rhos = 1000.; + ni = 0.5; + E = 5600000; + } } else if(simulation==3){ //bathe 2D rhof = 1000; muf = 0.04; rhos = 800; ni = 0.5; - E = 140000000; + E = 180000000; } else if(simulation<7){ //bathe 3D rhof = 100.; @@ -212,9 +219,14 @@ int main(int argc,char **args) { // ******* Init multilevel mesh from mesh.neu file ******* unsigned short numberOfUniformRefinedMeshes, numberOfAMRLevels; - if(simulation < 3) - numberOfUniformRefinedMeshes=4; - else if(simulation == 3 || simulation == 7) + if(simulation < 3){ + numberOfUniformRefinedMeshes=3; + if( turek_FSI ==3 ) + numberOfUniformRefinedMeshes=4; + } + else if(simulation == 3) + numberOfUniformRefinedMeshes=3; + else if(simulation == 7) numberOfUniformRefinedMeshes=4; else if(simulation < 7) numberOfUniformRefinedMeshes=2; @@ -267,7 +279,12 @@ int main(int argc,char **args) { ml_sol.GenerateBdc("DX","Steady"); ml_sol.GenerateBdc("DY","Steady"); if (!dimension2D) ml_sol.GenerateBdc("DZ","Steady"); - ml_sol.GenerateBdc("U","Time_dependent"); + + if( turek_FSI == 2 || turek_FSI ==3 ) + ml_sol.GenerateBdc("U","Time_dependent"); + else + ml_sol.GenerateBdc("U","Steady"); + ml_sol.GenerateBdc("V","Steady"); if (!dimension2D) ml_sol.GenerateBdc("W","Steady"); ml_sol.GenerateBdc("P","Steady"); @@ -367,7 +384,7 @@ int main(int argc,char **args) { // time loop parameter system.AttachGetTimeIntervalFunction(SetVariableTimeStep); - const unsigned int n_timesteps = 10000; + const unsigned int n_timesteps = 500; ml_sol.GetWriter()->Pwrite(DEFAULT_OUTPUTDIR,"biquadratic",print_vars, 0); @@ -390,16 +407,24 @@ int main(int argc,char **args) { //--------------------------------------------------------------------------------------------------------------------- double SetVariableTimeStep(const double time) { - std::cout<GetSolutionType(ml_sol->GetIndex("U")); @@ -298,7 +298,9 @@ namespace femus { // look for boundary faces if(myel->GetFaceElementIndex(kel,jface)<0) { unsigned int face = -(mymsh->el->GetFaceElementIndex(kel,jface)+1); - if( !ml_sol->_SetBoundaryConditionFunction(0.,0.,0.,"U",tau,face,0.) && tau!=0.){ + if( !ml_sol->_SetBoundaryConditionFunction(0.,0.,0.,"U",tau,face,time) && tau!=0.){ + double tau_old; + ml_sol->_SetBoundaryConditionFunction(0.,0.,0.,"U",tau_old,face,time-dt); unsigned nve = mymsh->el->GetElementFaceDofNumber(kel,jface,SolType2); const unsigned felt = mymsh->el->GetElementFaceType(kel, jface); for(unsigned i=0; iel->GetLocalFaceVertexIndex(kel, jface, i); for(unsigned idim=0; idim Date: Wed, 1 Apr 2015 18:57:08 -0500 Subject: [PATCH 05/19] Removed _bc_fe_kk --- src/equations/BoundaryConditions.cpp | 10 ---------- src/equations/BoundaryConditions.hpp | 2 +- src/equations/CurrentElem.cpp | 6 +++--- src/solution/XDMFWriter.cpp | 2 +- 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/equations/BoundaryConditions.cpp b/src/equations/BoundaryConditions.cpp index 2e80858a8..82507eabc 100644 --- a/src/equations/BoundaryConditions.cpp +++ b/src/equations/BoundaryConditions.cpp @@ -21,9 +21,6 @@ namespace femus { //=== node delete[] _bc; - //=== element - for (uint l=0; l < _dofmap->_mesh._NoLevels; l++) delete [] _bc_fe_kk[l]; - delete [] _bc_fe_kk; //===penalty // clearElBc(); /*if (_Dir_pen_fl==1)*/ //DO IT ALWAYS! @@ -199,15 +196,12 @@ void BoundaryConditions::GenerateBdc() { //************************************************** //******** ELEM BASED ****************************** - _bc_fe_kk = new int*[_dofmap->_mesh._NoLevels]; int* DofOff_Lev_kk = new int[_dofmap->_mesh._NoLevels]; for (uint Level=0; Level <_dofmap->_mesh._NoLevels; Level++) { //loop over the levels DofOff_Lev_kk[Level] = _dofmap->_nvars[KK]*_dofmap->_DofNumLevFE[Level][KK]; - _bc_fe_kk[Level] = new int[DofOff_Lev_kk[Level]]; - for (int i=0; i < DofOff_Lev_kk[Level]; i++) _bc_fe_kk[Level][i] = DEFAULT_BC_FLAG; } //******** ELEM BASED ****************************** //************************************************ @@ -278,10 +272,6 @@ void BoundaryConditions::GenerateBdc() { int bdry_iel_lev = iel + sum_elems_prev_sd_at_lev; int vol_iel = _dofmap->_mesh._el_bdry_to_vol[Level][bdry_iel_lev]; - for (uint ivar= 0; ivar < _dofmap->_nvars[KK]; ivar++) { - int dof_kk_pos_lev = vol_iel + ivar*_dofmap->_DofNumLevFE[Level][KK]; - if (_bc_fe_kk[Level][ dof_kk_pos_lev ] != 0) _bc_fe_kk[Level][ dof_kk_pos_lev ] = bc_flag[ ivar + _dofmap->_VarOff[KK] ]; - } //******************* END ALL LEVELS, ELEM VARS ************** } // end of element loop diff --git a/src/equations/BoundaryConditions.hpp b/src/equations/BoundaryConditions.hpp index 6dffe9066..e33c2df0a 100644 --- a/src/equations/BoundaryConditions.hpp +++ b/src/equations/BoundaryConditions.hpp @@ -37,7 +37,7 @@ class BoundaryConditions { //==== BOUNDARY CONDITIONS of the equation ========= (procs,levels) == //MultilevelSolution //======================================================================= int *_bc; //==== NODAL DIRICHLET ======== ///< boundary conditions map (top level) // POINTWISE(NODAL) FLAG for the BOUNDARY DOFS = FLAG for the tEST FUNCTIONS //TODO this should be PrintNumericVector of the equation, integer instead of double! do it when you make it parallel especially! //Later on I will do a bc for every level, considering the ELEMENT DOFS - int **_bc_fe_kk; //==== CELL DIRICHLET ======== +// int **_bc_fe_kk; //==== CELL DIRICHLET ======== void GenerateBdc(); //MultilevelSolution //========= treating NumericVectors, related to Dirichlet Boundary Conditions! ======= void Bc_ScaleDofVec(NumericVector * myvec, double ScaleFac); diff --git a/src/equations/CurrentElem.cpp b/src/equations/CurrentElem.cpp index 338b5f46f..270882625 100644 --- a/src/equations/CurrentElem.cpp +++ b/src/equations/CurrentElem.cpp @@ -92,9 +92,9 @@ for (uint ivar=0; ivar < _eqn->_dofmap._nvars[fe]; ivar++) { const uint indx = d + ivar*_elem_type[fe]->GetNDofs() + off_local_el[fe]; _el_dof_indices[indx] = _eqn->_dofmap.GetDof(_Level,fe,ivar,DofObj); - if (fe < KK ) { const uint dofkivar = _eqn->_dofmap.GetDof(Lev_pick_bc_dof,fe,ivar,DofObj); - _bc_eldofs[indx] = _eqn->_bcond._bc[dofkivar]; } - else if (fe == KK) _bc_eldofs[indx] = _eqn->_bcond._bc_fe_kk[_Level][ DofObj + ivar*_eqn->_dofmap._DofNumLevFE[_Level][KK] ]; + const uint dofkivar = _eqn->_dofmap.GetDof(Lev_pick_bc_dof,fe,ivar,DofObj); + _bc_eldofs[indx] = _eqn->_bcond._bc[dofkivar]; + } } } // end fe diff --git a/src/solution/XDMFWriter.cpp b/src/solution/XDMFWriter.cpp index 1288d68a0..68c51cf14 100644 --- a/src/solution/XDMFWriter.cpp +++ b/src/solution/XDMFWriter.cpp @@ -2655,7 +2655,7 @@ void XDMFWriter::PrintCaseHDF5Linear(const std::string output_path, const uint t for (;pos!=pos_e;pos++) { SystemTwo* eqn = static_cast(pos->second); XDMFWriter::write(filename.str(),& ml_prob.GetMeshTwo(),&(eqn->_dofmap),eqn); // initial solution - XDMFWriter::write_bc(filename.str(),& ml_prob.GetMeshTwo(),&(eqn->_dofmap),eqn,eqn->_bcond._bc,eqn->_bcond._bc_fe_kk); // boundary condition + XDMFWriter::write_bc(filename.str(),& ml_prob.GetMeshTwo(),&(eqn->_dofmap),eqn,eqn->_bcond._bc,NULL); // boundary condition } } //end iproc From b909df1f0d0e1d863a92353a9f117bc0d31ff293 Mon Sep 17 00:00:00 2001 From: Giorgio Bornia Date: Thu, 2 Apr 2015 11:29:34 -0500 Subject: [PATCH 06/19] Removed temperature-dependent part from mhdopt --- applications/OptimalControl/mhdopt/EqnNS.cpp | 40 ----------- .../OptimalControl/mhdopt/OptLoop.hpp | 3 - .../OptimalControl/mhdopt/OptQuantities.cpp | 60 ---------------- .../OptimalControl/mhdopt/OptQuantities.hpp | 70 ------------------- applications/OptimalControl/mhdopt/main.cpp | 53 +++++++++----- .../OptimalControl/tempopt/OptLoop.cpp | 4 ++ src/equations/CurrentQuantity.cpp | 6 ++ src/equations/CurrentQuantity.hpp | 10 ++- 8 files changed, 56 insertions(+), 190 deletions(-) diff --git a/applications/OptimalControl/mhdopt/EqnNS.cpp b/applications/OptimalControl/mhdopt/EqnNS.cpp index 9e0005092..38c094935 100644 --- a/applications/OptimalControl/mhdopt/EqnNS.cpp +++ b/applications/OptimalControl/mhdopt/EqnNS.cpp @@ -32,20 +32,6 @@ SystemTwo & my_system = ml_prob.get_system("Eqn_NS"); -#if TEMP_DEPS==1 -//for this one i decide not to use any Vect's -//i do not need the vects so badly if i do not have to do space interpolation -//here I need the pointer but not as a Quantity, but as the child class -//also, since these quantities are not used for interpolation -//i do not add them to the EXTERNAL MAP. The purpose of that map would be to -//loop automatically over it for getting the dofs. -//but actually it is not so necessary to have it. For instance you may need -//to use a specific function, in which case you first should do the static cast -//for some Vect and nothing for others -//so, it could be better to do a Vect_LOCAL_EXTERNAL MAP inside here -Density* density_ptr = static_cast(ml_prob.GetQtyMap().GetQuantity("Qty_Density")); -Viscosity* viscosity_ptr = static_cast(ml_prob.GetQtyMap().GetQuantity("Qty_Viscosity")); -#endif //temp deps //====== reference values ======================== //====== related to Quantities on which Operators act, and to the choice of the "LEADING" EQUATION Operator //====== Physics @@ -223,15 +209,6 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); #endif //======================== MAG WORLD ================================ -//===================TEMPERATURE WORLD============================= -#if TEMP_QTY==1 - CurrentQuantity Temp(currgp); - Temp._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Temperature"); - Temp.VectWithQtyFillBasic(); - Temp.Allocate(); -#endif -//=================== TEMPERATURE WORLD============================ - //=======gravity================================== CurrentQuantity gravity(currgp); gravity._dim=DIMENSION; @@ -268,10 +245,6 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); else Bhom._qtyptr->FunctionDof(Bhom,time,&xyz_refbox._val_dofs[0]); #endif -#if (TEMP_QTY==1) - if ( Temp._eqnptr != NULL ) Temp.GetElemDofs(); - else Temp._qtyptr->FunctionDof(Temp,time,&xyz_refbox._val_dofs[0]); -#endif //=== the connectivity is only related to the ELEMENT, so it is GEOMETRICAL //===then, the DofMap is RELATED to the EQUATION the Vect comes from! @@ -381,19 +354,6 @@ for (uint fe = 0; fe < QL; fe++) { Math::cross(Jext_g3D,&Bmag._val_g3D[0],JextXB_g3D); #endif -#if (TEMP_QTY==1) - Temp.val_g(); - #endif - -#if (TEMP_DEPS==1) - double rho_t=1.; density_ptr->Temp_dep(Temp._val_g[0],rho_t); rho_nd *= rho_t; - double mu_t=1. ; density_ptr->Temp_dep(Temp._val_g[0],mu_t) ; mu_nd *= mu_t; -#endif - -#ifdef AXISYMX - dtxJxW_g *=yyg; //what is the symmetry axis? I guess the x axis. -#endif - //============================================================== //========= FILLING ELEMENT MAT/RHS (i loop) ==================== //============================================================== diff --git a/applications/OptimalControl/mhdopt/OptLoop.hpp b/applications/OptimalControl/mhdopt/OptLoop.hpp index f77eff3b2..265029b2e 100644 --- a/applications/OptimalControl/mhdopt/OptLoop.hpp +++ b/applications/OptimalControl/mhdopt/OptLoop.hpp @@ -82,9 +82,6 @@ class OptLoop : public TimeLoop { #define OPT_CONTROL 1 //Provided quantities: DesVelocity //********************************* -#define TEMP_QTY 1 -//Provided quantities: Temperature - //********************************** diff --git a/applications/OptimalControl/mhdopt/OptQuantities.cpp b/applications/OptimalControl/mhdopt/OptQuantities.cpp index b8adc619f..678b12777 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.cpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.cpp @@ -18,42 +18,6 @@ // ================================================================== // ================================================================== -SpecificHeatP::SpecificHeatP(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) -: Quantity(name_in,qtymap_in,dim_in,FEord_in) { - //let us override any possible mistake in the instantiation - //the rule is Qty_ + the class name. - //putting this here i avoid using the default arguments which i dislike because they - //must be at the bottom of the list of arguments - //we shouldnt do like this and give the user the possibility of - //defining MORE INSTANTIATIONS of the SpecificHeatP type - //TODO but, beware that more instantiations would mean for instance DIFFERENT FUNCTIONS of x,y,z,t, - //so maybe you'll just want to define another specificHeatP class - -} - -HeatConductivity::HeatConductivity(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) -: Quantity(name_in,qtymap_in,dim_in,FEord_in) { - -} - -Viscosity::Viscosity(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) -: Quantity(name_in,qtymap_in,dim_in,FEord_in) { - -} - -Density::Density(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) -: Quantity(name_in,qtymap_in,dim_in,FEord_in) { - -} -//======end temp dependence - - -//=========================================================================== -Temperature::Temperature(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) -: Quantity(name_in,qtymap_in,dim_in,FEord_in) { - -} - //=========================================================================== MagnFieldHom::MagnFieldHom(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) : Quantity(name_in,qtymap_in,dim_in,FEord_in) { @@ -315,30 +279,6 @@ void PressureAdj::Function_txyz(const double t, const double* xp,double* func) c } -// ================================================= -void Temperature::Function_txyz(const double t, const double* xp,double* temp) const { - //the coordinates (x,y,z,t) of the VOLUME domain are NON-DIMENSIONAL - //and the function value must be nondimensional as well - - //the compidx may be useful when you have to set a component other than zero... for instance, - //you have three neutron fluxes, or pressure is u_value[4] instead of the first scalar - //We pass the pointer and the index, for scalar variables - //for vector variables we always assume that they go from 0 to DIMENSION-1. Actually, - //it might happen something different. So,maybe, to make things not very complicated, - // it suffices to pass the pointer, and then externally one will think of shifting the indices and so on.. anyway. - - const double Tref = _qtymap.GetInputParser()->get("Tref"); - - - Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); - - temp[0] = 100.*(xp[0])*( ( box->_le[0] - box->_lb[0]) - xp[0])/Tref; - - - - return; - } - diff --git a/applications/OptimalControl/mhdopt/OptQuantities.hpp b/applications/OptimalControl/mhdopt/OptQuantities.hpp index 3cb29d85d..c9ed5099a 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.hpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.hpp @@ -170,76 +170,6 @@ class DesVelocity : public Quantity { }; -//=============================== -//temp-dep ========= -//=============================== - -class Temperature : public Quantity { - - public: - - Temperature(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~Temperature(){}; - - void Function_txyz(const double t, const double* xp,double* temp) const; - -}; - - -class Density : public Quantity { - - public: - - Density(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~Density(){}; - - void Function_txyz(const double t, const double* xp,double* temp) const{}; - -void Temp_dep(const double temp_in, double& rho_out) const {rho_out = 1.;return;} - -}; - -class Viscosity : public Quantity { - - public: - - Viscosity(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~Viscosity(){}; - - void Function_txyz(const double t, const double* xp,double* temp) const{}; - -void Temp_dep(const double temp_in, double& mu_out) const {mu_out = 1.;return;} - -}; - - -class HeatConductivity : public Quantity { - - public: - - HeatConductivity(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~HeatConductivity(){}; - - void Function_txyz(const double t, const double* xp,double* temp) const{}; - -void Temp_dep(const double temp_in, double& mu_out) const {mu_out = 1.;return;} - -}; - -class SpecificHeatP : public Quantity { - - public: - - SpecificHeatP(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~SpecificHeatP(){}; - - void Function_txyz(const double t, const double* xp,double* temp) const{}; - -void Temp_dep(const double temp_in, double& mu_out) const {mu_out = 1.;return;} - -}; - - #endif diff --git a/applications/OptimalControl/mhdopt/main.cpp b/applications/OptimalControl/mhdopt/main.cpp index 3c58aa99e..46c8848d8 100644 --- a/applications/OptimalControl/mhdopt/main.cpp +++ b/applications/OptimalControl/mhdopt/main.cpp @@ -110,6 +110,7 @@ int main(int argc, char** argv) { QuantityMap qty_map; qty_map.SetMeshTwo(&mesh); qty_map.SetInputParser(&physics_map); + //================================ // ======= Add QUANTITIES ======== //================================ @@ -135,16 +136,7 @@ int main(int argc, char** argv) { //consistency check if (velocity._dim != des_velocity._dim) {std::cout << "main: inconsistency" << std::endl; abort();} if (velocity._FEord != des_velocity._FEord) {std::cout << "main: inconsistency" << std::endl; abort();} - -// #if TEMP_DEPS==1 - Temperature temperature("Qty_Temperature",qty_map,1,QQ); qty_map.AddQuantity(&temperature); - Density density("Qty_Density",qty_map,1,QQ); qty_map.AddQuantity(&density); - Viscosity viscosity("Qty_Viscosity",qty_map,1,QQ); qty_map.AddQuantity(&viscosity); - HeatConductivity heat_cond("Qty_HeatConductivity",qty_map,1,QQ); qty_map.AddQuantity(&heat_cond); - SpecificHeatP spec_heatP("Qty_SpecificHeatP",qty_map,1,QQ); qty_map.AddQuantity(&spec_heatP); -// #endif - - + //================================ //==== END Add QUANTITIES ======== //================================ @@ -159,7 +151,26 @@ int main(int argc, char** argv) { ml_msh.SetDomain(&mybox); MultiLevelSolution ml_sol(&ml_msh); - ml_sol.AddSolution("FAKE",LAGRANGE,SECOND,0); + + ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_MagnFieldHom",LAGRANGE,SECOND,0); +// ml_sol.AddSolution("Qty_MagnFieldHomLagMult",LAGRANGE,FIRST,0); +// +// ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_MagnFieldExt",LAGRANGE,SECOND,0); +// ml_sol.AddSolution("Qty_MagnFieldExtLagMult",LAGRANGE,FIRST,0); +// +// ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_MagnFieldHomAdj",LAGRANGE,SECOND,0); +// ml_sol.AddSolution("Qty_MagnFieldHomLagMultAdj",LAGRANGE,FIRST,0); +// +// ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_Velocity",LAGRANGE,SECOND,0); +// ml_sol.AddSolution("Qty_Pressure",LAGRANGE,FIRST,0); +// +// ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_VelocityAdj",LAGRANGE,SECOND,0); +// ml_sol.AddSolution("Qty_PressureAdj",LAGRANGE,FIRST,0); +// +// ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_DesVelocity",LAGRANGE,SECOND,0,false); + + + MultiLevelProblem ml_prob(&ml_sol); ml_prob.SetMeshTwo(&mesh); @@ -175,7 +186,9 @@ int main(int argc, char** argv) { #if NS_EQUATIONS==1 SystemTwo & eqnNS = ml_prob.add_system("Eqn_NS"); - eqnNS.AddSolutionToSystemPDE("FAKE"); + + eqnNS.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHom"); + eqnNS.AddUnknownToSystemPDE(&velocity); eqnNS.AddUnknownToSystemPDE(&pressure); eqnNS.SetAssembleFunction(GenMatRhsNS); @@ -183,7 +196,9 @@ int main(int argc, char** argv) { #if NSAD_EQUATIONS==1 SystemTwo & eqnNSAD = ml_prob.add_system("Eqn_NSAD"); - eqnNSAD.AddSolutionToSystemPDE("FAKE"); + + eqnNSAD.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHom"); + eqnNSAD.AddUnknownToSystemPDE(&velocity_adj); eqnNSAD.AddUnknownToSystemPDE(&pressure_adj); eqnNSAD.SetAssembleFunction(GenMatRhsNSAD); @@ -191,7 +206,9 @@ int main(int argc, char** argv) { #if MHD_EQUATIONS==1 SystemTwo & eqnMHD = ml_prob.add_system("Eqn_MHD"); - eqnMHD.AddSolutionToSystemPDE("FAKE"); + + eqnMHD.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHom"); + eqnMHD.AddUnknownToSystemPDE(&bhom); eqnMHD.AddUnknownToSystemPDE(&bhom_lag_mult); eqnMHD.SetAssembleFunction(GenMatRhsMHD); @@ -199,7 +216,9 @@ int main(int argc, char** argv) { #if MHDAD_EQUATIONS==1 SystemTwo & eqnMHDAD = ml_prob.add_system("Eqn_MHDAD"); - eqnMHDAD.AddSolutionToSystemPDE("FAKE"); + + eqnMHDAD.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHom"); + eqnMHDAD.AddUnknownToSystemPDE(&bhom_adj); eqnMHDAD.AddUnknownToSystemPDE(&bhom_lag_mult_adj); eqnMHDAD.SetAssembleFunction(GenMatRhsMHDAD); @@ -207,7 +226,9 @@ int main(int argc, char** argv) { #if MHDCONT_EQUATIONS==1 SystemTwo & eqnMHDCONT = ml_prob.add_system("Eqn_MHDCONT"); - eqnMHDCONT.AddSolutionToSystemPDE("FAKE"); + + eqnMHDCONT.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHom"); + eqnMHDCONT.AddUnknownToSystemPDE(&Bext); eqnMHDCONT.AddUnknownToSystemPDE(&Bext_lag_mult); eqnMHDCONT.SetAssembleFunction(GenMatRhsMHDCONT); diff --git a/applications/OptimalControl/tempopt/OptLoop.cpp b/applications/OptimalControl/tempopt/OptLoop.cpp index 796c08f74..760819681 100644 --- a/applications/OptimalControl/tempopt/OptLoop.cpp +++ b/applications/OptimalControl/tempopt/OptLoop.cpp @@ -107,18 +107,21 @@ double ComputeIntegral (const uint Level, const MultiLevelMeshTwo* mesh, const S //========== CurrentQuantity Tempold(currgp); Tempold._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_Temperature"); + Tempold._SolName = "Qty_Temperature"; Tempold.VectWithQtyFillBasic(); Tempold.Allocate(); //========== CurrentQuantity Tlift(currgp); Tlift._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_TempLift"); + Tlift._SolName = "Qty_TempLift"; Tlift.VectWithQtyFillBasic(); Tlift.Allocate(); //=========== CurrentQuantity Tdes(currgp); Tdes._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_TempDes"); + Tdes._SolName = "Qty_TempDes"; Tdes.VectWithQtyFillBasic(); Tdes.Allocate(); @@ -247,6 +250,7 @@ double ComputeNormControl (const uint Level, const MultiLevelMeshTwo* mesh, cons //========== CurrentQuantity Tlift(currgp); Tlift._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_TempLift"); + Tlift._SolName = "Qty_TempLift"; Tlift.VectWithQtyFillBasic(); Tlift.Allocate(); diff --git a/src/equations/CurrentQuantity.cpp b/src/equations/CurrentQuantity.cpp index de99ba8b1..ed7ce9e85 100644 --- a/src/equations/CurrentQuantity.cpp +++ b/src/equations/CurrentQuantity.cpp @@ -139,6 +139,12 @@ void CurrentQuantity::VectWithQtyFillBasic() { _dim = _qtyptr->_dim; _FEord = _qtyptr->_FEord; _ndof = _currEl.GetElemType(_FEord)->GetNDofs(); + + +// if (_SolName == "") { std::cout << " I need to have a solution " << std::endl; abort(); } + + + return; } diff --git a/src/equations/CurrentQuantity.hpp b/src/equations/CurrentQuantity.hpp index f2c54788c..c83462232 100644 --- a/src/equations/CurrentQuantity.hpp +++ b/src/equations/CurrentQuantity.hpp @@ -39,7 +39,6 @@ namespace femus { //if you have NO Quantity and NO Equation ========== // void SetElDofsFromArgs(const uint vb,const double * dofs); //if you have NO Quantity and NO Equation, we should do the more flexible version of a Vect //but the point is that we have to pass also the offset... - std::string _SolName; std::vector _val_g; std::vector _val_g3D; @@ -62,6 +61,15 @@ namespace femus { return _currEl; } + + std::string _SolName; + + vector< int > _dofSOL; + unsigned _indexSOL; + unsigned _indSOL; + unsigned _SolTypeSOL; + + protected: const CurrentGaussPointBase & _currGP; From 5f45bff932ae2665135ba0a39faeb823a16bbbe0 Mon Sep 17 00:00:00 2001 From: Giorgio Bornia Date: Thu, 2 Apr 2015 14:50:24 -0500 Subject: [PATCH 07/19] Added DEFAULT_SOL_NCHARS to have more than 8 chars in SolName --- applications/OptimalControl/mhdopt/main.cpp | 33 ++++++++++----------- src/solution/MultiLevelSolution.cpp | 5 ++-- src/solution/Solution.cpp | 3 +- src/solution/Solution.hpp | 2 +- src/utils/FemusDefault.hpp | 7 +---- 5 files changed, 23 insertions(+), 27 deletions(-) diff --git a/applications/OptimalControl/mhdopt/main.cpp b/applications/OptimalControl/mhdopt/main.cpp index 46c8848d8..e3431f3a7 100644 --- a/applications/OptimalControl/mhdopt/main.cpp +++ b/applications/OptimalControl/mhdopt/main.cpp @@ -143,8 +143,7 @@ int main(int argc, char** argv) { // ====== Start new main ================================= MultiLevelMesh ml_msh; - ml_msh.GenerateCoarseBoxMesh(8,8,8,0,1,0,1,0,1,HEX27,"fifth"); -// ml_msh.GenerateCoarseBoxMesh(numelemx,numelemy,numelemz,xa,xb,ya,yb,za,zb,elemtype,"seventh"); + ml_msh.GenerateCoarseBoxMesh(8,8,8,0,1,0,1,0,1,HEX27,"fifth"); // ml_msh.GenerateCoarseBoxMesh(numelemx,numelemy,numelemz,xa,xb,ya,yb,za,zb,elemtype,"seventh"); ml_msh.RefineMesh(NoLevels,NoLevels,NULL); ml_msh.PrintInfo(); @@ -153,21 +152,21 @@ int main(int argc, char** argv) { MultiLevelSolution ml_sol(&ml_msh); ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_MagnFieldHom",LAGRANGE,SECOND,0); -// ml_sol.AddSolution("Qty_MagnFieldHomLagMult",LAGRANGE,FIRST,0); -// -// ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_MagnFieldExt",LAGRANGE,SECOND,0); -// ml_sol.AddSolution("Qty_MagnFieldExtLagMult",LAGRANGE,FIRST,0); -// -// ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_MagnFieldHomAdj",LAGRANGE,SECOND,0); -// ml_sol.AddSolution("Qty_MagnFieldHomLagMultAdj",LAGRANGE,FIRST,0); -// -// ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_Velocity",LAGRANGE,SECOND,0); -// ml_sol.AddSolution("Qty_Pressure",LAGRANGE,FIRST,0); -// -// ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_VelocityAdj",LAGRANGE,SECOND,0); -// ml_sol.AddSolution("Qty_PressureAdj",LAGRANGE,FIRST,0); -// -// ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_DesVelocity",LAGRANGE,SECOND,0,false); + ml_sol.AddSolution("Qty_MagnFieldHomLagMult",LAGRANGE,FIRST,0); + + ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_MagnFieldExt",LAGRANGE,SECOND,0); + ml_sol.AddSolution("Qty_MagnFieldExtLagMult",LAGRANGE,FIRST,0); + + ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_MagnFieldHomAdj",LAGRANGE,SECOND,0); + ml_sol.AddSolution("Qty_MagnFieldHomLagMultAdj",LAGRANGE,FIRST,0); + + ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_Velocity",LAGRANGE,SECOND,0); + ml_sol.AddSolution("Qty_Pressure",LAGRANGE,FIRST,0); + + ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_VelocityAdj",LAGRANGE,SECOND,0); + ml_sol.AddSolution("Qty_PressureAdj",LAGRANGE,FIRST,0); + + ml_sol.AddSolutionVector(ml_msh.GetDimension(),"Qty_DesVelocity",LAGRANGE,SECOND,0,false); diff --git a/src/solution/MultiLevelSolution.cpp b/src/solution/MultiLevelSolution.cpp index 57b8dc0e3..d2f7c34f9 100644 --- a/src/solution/MultiLevelSolution.cpp +++ b/src/solution/MultiLevelSolution.cpp @@ -21,6 +21,7 @@ PURPOSE. See the above copyright notice for more information. #include "SparseMatrix.hpp" #include "NumericVector.hpp" #include "FemusConfig.hpp" +#include "FemusDefault.hpp" #include "ParsedFunction.hpp" @@ -98,7 +99,7 @@ void MultiLevelSolution::AddSolutionLevel(){ void MultiLevelSolution::AddSolution(const char name[], const FEFamily fefamily, const FEOrder order, unsigned tmorder, const bool &PdeType) { - unsigned n=_SolType.size(); + unsigned n =_SolType.size(); _SolType.resize(n+1u); _family.resize(n+1u); _order.resize(n+1u); @@ -114,7 +115,7 @@ void MultiLevelSolution::AddSolution(const char name[], const FEFamily fefamily, _family[n] = fefamily; _order[n] = order; _SolType[n] = order - ((fefamily==LAGRANGE)?1:0) + fefamily*3; - _SolName[n] = new char [8]; + _SolName[n] = new char [DEFAULT_SOL_NCHARS]; _BdcType[n] = new char [20]; strcpy(_SolName[n],name); _SolTmorder[n]=tmorder; diff --git a/src/solution/Solution.cpp b/src/solution/Solution.cpp index a39b03003..24ca7d101 100644 --- a/src/solution/Solution.cpp +++ b/src/solution/Solution.cpp @@ -21,6 +21,7 @@ #include #include #include "Solution.hpp" +#include "FemusDefault.hpp" #include "ElemType.hpp" #include "ParalleltypeEnum.hpp" #include "NumericVector.hpp" @@ -83,7 +84,7 @@ void Solution::AddSolution( const char name[], const FEFamily fefamily, const FE _SolType[n] = order - ((fefamily==LAGRANGE)?1:0) + fefamily*3; _SolTmOrder[n]=tmorder; _SolOld.resize(n+1u); - _SolName[n]=new char [8]; + _SolName[n]=new char [DEFAULT_SOL_NCHARS]; strcpy(_SolName[n],name); } diff --git a/src/solution/Solution.hpp b/src/solution/Solution.hpp index 694cd2ea7..bf11186ca 100644 --- a/src/solution/Solution.hpp +++ b/src/solution/Solution.hpp @@ -29,7 +29,7 @@ #include "petscmat.h" #include "FElemTypeEnum.hpp" #include "ParallelObject.hpp" -#include "vector" +#include namespace femus { diff --git a/src/utils/FemusDefault.hpp b/src/utils/FemusDefault.hpp index 0e0b06a31..4f7e28c7b 100644 --- a/src/utils/FemusDefault.hpp +++ b/src/utils/FemusDefault.hpp @@ -6,6 +6,7 @@ // The idea is that EACH PARAMETER HERE CAN EVENTUALLY BE OVERRIDDEN at RUNTIME, // either from a file to be read at runtime, or from the main, or from command line, or something +#define DEFAULT_SOL_NCHARS 32 //GMV accepts at most 32 characters for a field //********************************************* //************** FILES ************************ @@ -62,12 +63,6 @@ #define DEFAULT_BDRY_TOLL 0.0000001 //********************************************* -//**************************************** -//********** NUMERIC VECTOR ************** -// Default tolerance used when comparing two NumericVectors -// Actually in libmesh it is much less! -#define DEFAULT_NUMVEC_TOLERANCE 1.e-20 -//**************************************** //************************************************************************************** //************************EQNBASE - MULTIGRID ****************************************** From 1f660f0322d52cab5553b717c6937ac6551dc202 Mon Sep 17 00:00:00 2001 From: eaulisa Date: Thu, 2 Apr 2015 16:32:28 -0500 Subject: [PATCH 08/19] fixed C1 nad C2 in mooney-rvlin --- .../FSI/FSITimeDependentBenchmarks/main.cpp | 23 ++++++++++--------- ...IncompressibleFSIAssemblyTimeDependent.hpp | 22 ++++++++++-------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/applications/FSI/FSITimeDependentBenchmarks/main.cpp b/applications/FSI/FSITimeDependentBenchmarks/main.cpp index 3a2890ea1..0f2bb23c7 100644 --- a/applications/FSI/FSITimeDependentBenchmarks/main.cpp +++ b/applications/FSI/FSITimeDependentBenchmarks/main.cpp @@ -134,7 +134,7 @@ int main(int argc,char **args) { infile = "./input/beam.neu"; } else if(3 == simulation){ - infile = "./input/drum.neu"; + infile = "./input/drum2.neu"; } else if(4 == simulation) { infile = "./input/bathe_FSI.neu"; @@ -168,14 +168,14 @@ int main(int argc,char **args) { muf = 1.; rhos = 10000.; ni = 0.5; - E = 1400000; + E = 1400000*(1.5/1.4); } else if (turek_FSI == 3){ //Turek-Hron FSI3 rhof = 1000.; muf = 1.; rhos = 1000.; ni = 0.5; - E = 5600000; + E = 5600000*(1.5/1.4); } } else if(simulation==3){ //bathe 2D @@ -183,14 +183,14 @@ int main(int argc,char **args) { muf = 0.04; rhos = 800; ni = 0.5; - E = 180000000; + E = 120000000; } else if(simulation<7){ //bathe 3D rhof = 100.; muf = 1.; rhos = 800; ni = 0.5; - E = 1800000; + E = 1200000; } else if(simulation==7){ //comsol rhof = 1000.; @@ -225,7 +225,7 @@ int main(int argc,char **args) { numberOfUniformRefinedMeshes=4; } else if(simulation == 3) - numberOfUniformRefinedMeshes=3; + numberOfUniformRefinedMeshes=4; else if(simulation == 7) numberOfUniformRefinedMeshes=4; else if(simulation < 7) @@ -409,9 +409,9 @@ int main(int argc,char **args) { double SetVariableTimeStep(const double time) { double dt = 1.; if( turek_FSI == 2 ){ - if ( time < 5. ) dt = 0.1; - else if ( time < 9. ) dt = 0.05; - else dt = 0.025; + if ( time < 5. ) dt = 0.1; + else if ( time < 6.5 ) dt = 0.05; + else dt = 0.01; } else if ( turek_FSI == 3 ){ if ( time < 5. ) dt = 0.1; @@ -419,6 +419,7 @@ double SetVariableTimeStep(const double time) { else dt = 0.01; } else if ( simulation == 3 ) dt=0.001; + else if ( simulation == 4 ) dt=0.01; else if ( simulation == 7 ) dt=0.001; else{ std::cout << "Warning this simulation case has not been considered yet for the time dependent case"< Date: Thu, 2 Apr 2015 17:34:33 -0500 Subject: [PATCH 09/19] DesVelocity in mhdopt is in scalar components now --- applications/OptimalControl/mhdopt/EqnNS.cpp | 8 +- .../OptimalControl/mhdopt/EqnNSAD.cpp | 41 ++++++--- .../OptimalControl/mhdopt/OptLoop.cpp | 36 ++++++-- .../OptimalControl/mhdopt/OptQuantities.cpp | 87 +++++++++++++++++-- .../OptimalControl/mhdopt/OptQuantities.hpp | 26 +++++- applications/OptimalControl/mhdopt/main.cpp | 48 ++++++---- 6 files changed, 194 insertions(+), 52 deletions(-) diff --git a/applications/OptimalControl/mhdopt/EqnNS.cpp b/applications/OptimalControl/mhdopt/EqnNS.cpp index 38c094935..eee8719bd 100644 --- a/applications/OptimalControl/mhdopt/EqnNS.cpp +++ b/applications/OptimalControl/mhdopt/EqnNS.cpp @@ -150,17 +150,16 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); //=========INTERNAL QUANTITIES (unknowns of the equation) ================== CurrentQuantity VelOld(currgp); - VelOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYZERO]; //an alternative cannot exist, because it is an Unknown of This Equation - VelOld.VectWithQtyFillBasic(); //the internal quantities will eventually have *this as eqn pointer + VelOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity"); + VelOld.VectWithQtyFillBasic(); VelOld.Allocate(); const uint qtyzero_ord = VelOld._FEord; const uint qtyzero_ndof = VelOld._ndof; - Velocity* vel_castqtyptr = static_cast(VelOld._qtyptr); //casting for quantity-specific functions //========= CurrentQuantity pressOld(currgp); - pressOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYONE]; + pressOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Pressure"); pressOld.VectWithQtyFillBasic(); pressOld.Allocate(); @@ -517,7 +516,6 @@ for (uint fe = 0; fe < QL; fe++) { const uint qtyzero_ord = VelOld._FEord; const uint qtyzero_ndof = VelOld._ndof; - Velocity* vel_castqtyptr = static_cast(VelOld._qtyptr); //casting for quantity-specific functions //========= CurrentQuantity pressOld(currgp); diff --git a/applications/OptimalControl/mhdopt/EqnNSAD.cpp b/applications/OptimalControl/mhdopt/EqnNSAD.cpp index b950da1cd..5d7045dea 100644 --- a/applications/OptimalControl/mhdopt/EqnNSAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnNSAD.cpp @@ -103,12 +103,30 @@ const int NonStatNSAD = (int) ml_prob.GetInputParser().get("NonStatNSAD"); Vel._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity"); Vel.VectWithQtyFillBasic(); Vel.Allocate(); + - CurrentQuantity VelDes(currgp); - VelDes._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_DesVelocity"); - VelDes.VectWithQtyFillBasic(); - VelDes.Allocate(); - + CurrentQuantity VelDesX(currgp); + VelDesX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_DesVelocity0"); + VelDesX.VectWithQtyFillBasic(); + VelDesX.Allocate(); + + CurrentQuantity VelDesY(currgp); + VelDesY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_DesVelocity1"); + VelDesY.VectWithQtyFillBasic(); + VelDesY.Allocate(); + + CurrentQuantity VelDesZ(currgp); + VelDesZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_DesVelocity2"); + VelDesZ.VectWithQtyFillBasic(); + VelDesZ.Allocate(); + + std::vector VelDes_vec; + VelDes_vec.push_back(&VelDesX); + VelDes_vec.push_back(&VelDesY); + VelDes_vec.push_back(&VelDesZ); + + + CurrentQuantity Bhom(currgp); Bhom._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom"); Bhom.VectWithQtyFillBasic(); @@ -157,9 +175,11 @@ const int NonStatNSAD = (int) ml_prob.GetInputParser().get("NonStatNSAD"); else Bext._qtyptr->FunctionDof(Bext,time,&xyz_refbox._val_dofs[0]); if ( BhomAdj._eqnptr != NULL ) BhomAdj.GetElemDofs(); else BhomAdj._qtyptr->FunctionDof(BhomAdj,time,&xyz_refbox._val_dofs[0]); - if ( VelDes._eqnptr != NULL ) VelDes.GetElemDofs(); - else VelDes._qtyptr->FunctionDof(VelDes,time,&xyz_refbox._val_dofs[0]); - + + for (uint idim=0; idim < space_dim; idim++) { + if ( VelDes_vec[idim]->_eqnptr != NULL ) VelDes_vec[idim]->GetElemDofs(); + else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],time,&xyz_refbox._val_dofs[0]); + } //======SUM Bhom and Bext //from now on, you'll only use Bmag //Bmag,Bext and Bhom must have the same orders! Math::zeroN(&Bmag._val_dofs[0],Bmag._dim*Bmag._ndof); @@ -202,8 +222,9 @@ for (uint fe = 0; fe < QL; fe++) { BhomAdj.curl_g(); Bmag.val_g(); Vel.val_g(); - VelDes.val_g(); Vel.grad_g(); + + for (uint idim=0; idim < space_dim; idim++) VelDes_vec[idim]->val_g(); //vector product Math::extend(&Bmag._val_g[0],&Bmag._val_g3D[0],space_dim); @@ -223,7 +244,7 @@ for (uint fe = 0; fe < QL; fe++) { currelem.Rhs()(irowq) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( NonStatNSAD*VelAdjOld._val_g[idim]*phii_g/dt //time - curlxiXB_g3D[idim]*phii_g //this is due to the variation of velocity in the MAGNETIC ADVECTION, so it is due to a NONLINEAR COUPLING "u times B", "MY_STATE times OTHER_STATE" - - alphaVel*el_flagdom*(Vel._val_g[idim] - VelDes._val_g[idim])*phii_g //this is the dependence that counts + - alphaVel*el_flagdom*(Vel._val_g[idim] - VelDes_vec[idim]->_val_g[0])*phii_g //this is the dependence that counts ) + (1-currelem.GetBCDofFlag()[irowq])*detb*VelAdjOld._val_dofs[irowq]; //Dirichlet bc } diff --git a/applications/OptimalControl/mhdopt/OptLoop.cpp b/applications/OptimalControl/mhdopt/OptLoop.cpp index 0b304ec3a..5ffd9d7be 100644 --- a/applications/OptimalControl/mhdopt/OptLoop.cpp +++ b/applications/OptimalControl/mhdopt/OptLoop.cpp @@ -550,10 +550,27 @@ double ComputeIntegral (const uint Level, const MultiLevelMeshTwo* mesh, const S Vel.Allocate(); //========== - CurrentQuantity VelDes(currgp); - VelDes._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_DesVelocity"); - VelDes.VectWithQtyFillBasic(); - VelDes.Allocate(); + CurrentQuantity VelDesX(currgp); + VelDesX._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_DesVelocity0"); + VelDesX.VectWithQtyFillBasic(); + VelDesX.Allocate(); + + CurrentQuantity VelDesY(currgp); + VelDesY._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_DesVelocity1"); + VelDesY.VectWithQtyFillBasic(); + VelDesY.Allocate(); + + CurrentQuantity VelDesZ(currgp); + VelDesZ._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_DesVelocity2"); + VelDesZ.VectWithQtyFillBasic(); + VelDesZ.Allocate(); + + std::vector VelDes_vec; + VelDes_vec.push_back(&VelDesX); + VelDes_vec.push_back(&VelDesY); + VelDes_vec.push_back(&VelDesZ); + + const uint el_ngauss = eqn->GetMLProb().GetQrule(currelem.GetDim()).GetGaussPointsNumber(); @@ -571,8 +588,11 @@ double ComputeIntegral (const uint Level, const MultiLevelMeshTwo* mesh, const S if ( Vel._eqnptr != NULL ) Vel.GetElemDofs(); else Vel._qtyptr->FunctionDof(Vel,0./*time*/,&xyz_refbox._val_dofs[0]); //give the Hartmann flow, if not solving NS - if ( VelDes._eqnptr != NULL ) VelDes.GetElemDofs(); - else VelDes._qtyptr->FunctionDof(VelDes,0./*time*/,&xyz_refbox._val_dofs[0]); + + for (uint idim=0; idim < space_dim; idim++) { + if ( VelDes_vec[idim]->_eqnptr != NULL ) VelDes_vec[idim]->GetElemDofs(); + else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],0,&xyz_refbox._val_dofs[0]); + } //AAA time is picked as a function pointer of the time C library i think... // it doesnt say it was not declared @@ -589,11 +609,11 @@ for (uint fe = 0; fe < QL; fe++) { currgp.SetDPhiDxezetaElDofsFEVB_g (fe,qp for (uint fe = 0; fe < QL; fe++) { currgp.SetPhiElDofsFEVB_g (fe,qp); } Vel.val_g(); - VelDes.val_g(); + for (uint idim=0; idim < space_dim; idim++) VelDes_vec[idim]->val_g(); double deltau_squarenorm_g = 0.; -for (uint j=0; j_val_g[0])*(Vel._val_g[j] - VelDes_vec[j]->_val_g[0]); } //NO for (uint j=0; jget("Uref"); + +} + +//========================================================================== +DesVelocityY::DesVelocityY(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) +: Quantity(name_in,qtymap_in,dim_in,FEord_in) { + + for (uint i=0;iget("Uref"); + +} + +//========================================================================== +DesVelocityZ::DesVelocityZ(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) : Quantity(name_in,qtymap_in,dim_in,FEord_in) { for (uint i=0;iget("Uref"); @@ -413,9 +429,8 @@ return; -//I'll do that after checking NS + MHD ///Desired velocity for optimal control -void DesVelocity::Function_txyz(const double t, const double* xp,double* func) const { +void DesVelocityX::Function_txyz(const double t, const double* xp,double* func) const { const double Lref = _qtymap.GetInputParser()->get("Lref"); @@ -454,7 +469,6 @@ void DesVelocity::Function_txyz(const double t, const double* xp,double* func) c const double magnitude = _qtymap.GetInputParser()->get("udes")*DpDzad*Hm/LHm*(cosh(Hm/LHm) - cosh(Hm/LHm*xtr*Lref/Lhalf)) / (SIGMHD*Bref*Bref*sinh(Hm/LHm)*Uref); func[0] = -sin(thetaz)*magnitude; - func[1] = cos(thetaz)*magnitude; //add a 4 to the denominator //should check the difference between L and Lref //TODO check this nondimensionalization @@ -467,16 +481,73 @@ void DesVelocity::Function_txyz(const double t, const double* xp,double* func) c // get_par("udes")/**(x - lxb*ILref)*(lxe*ILref-x)*//Uref; // get_par("udes")/Uref; -#if (DIMENSION==3) - func[2] = 0./*/Uref*/; -#endif + + return; +} + + + +///Desired velocity for optimal control +void DesVelocityY::Function_txyz(const double t, const double* xp,double* func) const { + + + const double Lref = _qtymap.GetInputParser()->get("Lref"); + const double Uref = _qtymap.GetInputParser()->get("Uref"); + double ILref = 1./Lref; + + const double rhof = _qtymap.GetInputParser()->get("rho0"); + const double muvel = _qtymap.GetInputParser()->get("mu0"); + const double MUMHD = _qtymap.GetInputParser()->get("MUMHD"); + const double SIGMHD = _qtymap.GetInputParser()->get("SIGMHD"); + const double Bref = _qtymap.GetInputParser()->get("Bref"); + + const double DpDz = 1./*0.5*/; //AAA: change it according to the pressure distribution + + double DpDzad = DpDz*Lref/(rhof*Uref*Uref); + + double Re = _qtymap.GetInputParser()->get("Re"); + double Rem = _qtymap.GetInputParser()->get("Rem"); + double Hm = _qtymap.GetInputParser()->get("Hm"); + double S = _qtymap.GetInputParser()->get("S"); + + + Box* box= static_cast(_qtymap.GetMeshTwo()->GetDomain()); + + + double Lhalf = 0.5*(box->_le[0] - box->_lb[0]); + double Lmid = 0.5*(box->_le[0] + box->_lb[0]); + + double xtr = xp[0] - Lmid; + + const double thetaz = box->_domain_rtmap.get("thetaz"); + + //constant for the real reference length in the Hartmann number + const double LHm =2.; //this is because the reference length for Hm is HALF THE WIDTH of the domain, which is Lref=1 now + + const double magnitude = _qtymap.GetInputParser()->get("udes")*DpDzad*Hm/LHm*(cosh(Hm/LHm) - cosh(Hm/LHm*xtr*Lref/Lhalf)) / (SIGMHD*Bref*Bref*sinh(Hm/LHm)*Uref); + + func[0] = cos(thetaz)*magnitude; return; -} +} + +///Desired velocity for optimal control +void DesVelocityZ::Function_txyz(const double t, const double* xp,double* func) const { + + func[0] = 0.; + return; + +} + + + + + + void VelocityAdj::Function_txyz(const double t, const double* xp,double* func) const{ func[0] = 0./*/Uref*/; diff --git a/applications/OptimalControl/mhdopt/OptQuantities.hpp b/applications/OptimalControl/mhdopt/OptQuantities.hpp index c9ed5099a..b217a78f9 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.hpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.hpp @@ -158,18 +158,38 @@ class VelocityAdj : public Quantity { }; -class DesVelocity : public Quantity { +class DesVelocityX : public Quantity { public: - DesVelocity(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~DesVelocity(){}; + DesVelocityX(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); void Function_txyz(const double t, const double* xp,double* temp) const; }; +class DesVelocityY : public Quantity { + + public: + + DesVelocityY(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + + +}; + +class DesVelocityZ : public Quantity { + + public: + + DesVelocityZ(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + + +}; #endif diff --git a/applications/OptimalControl/mhdopt/main.cpp b/applications/OptimalControl/mhdopt/main.cpp index e3431f3a7..4ebc7232d 100644 --- a/applications/OptimalControl/mhdopt/main.cpp +++ b/applications/OptimalControl/mhdopt/main.cpp @@ -117,25 +117,27 @@ int main(int argc, char** argv) { MagnFieldHom bhom("Qty_MagnFieldHom",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom); MagnFieldExt Bext("Qty_MagnFieldExt",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&Bext); -//consistency check - if (bhom._dim != Bext._dim) {std::cout << "main: inconsistency" << std::endl;abort();} - if (bhom._FEord != Bext._FEord) {std::cout << "main: inconsistency" << std::endl;abort();} - + MagnFieldHomAdj bhom_adj("Qty_MagnFieldHomAdj",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom_adj); + + Velocity velocity("Qty_Velocity",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&velocity); + + VelocityAdj velocity_adj("Qty_VelocityAdj",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&velocity_adj); + MagnFieldHomLagMult bhom_lag_mult("Qty_MagnFieldHomLagMult",qty_map,1,LL); qty_map.AddQuantity(&bhom_lag_mult); MagnFieldExtLagMult Bext_lag_mult("Qty_MagnFieldExtLagMult",qty_map,1,LL); qty_map.AddQuantity(&Bext_lag_mult); - MagnFieldHomAdj bhom_adj("Qty_MagnFieldHomAdj",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom_adj); MagnFieldHomLagMultAdj bhom_lag_mult_adj("Qty_MagnFieldHomLagMultAdj",qty_map,1,LL); qty_map.AddQuantity(&bhom_lag_mult_adj); + Pressure pressure("Qty_Pressure",qty_map,1,LL); qty_map.AddQuantity(&pressure); + PressureAdj pressure_adj("Qty_PressureAdj",qty_map,1,LL); qty_map.AddQuantity(&pressure_adj); - Pressure pressure("Qty_Pressure",qty_map,1,LL); qty_map.AddQuantity(&pressure); - Velocity velocity("Qty_Velocity",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&velocity); + DesVelocityX des_velocityX("Qty_DesVelocity0",qty_map,1,QQ); qty_map.AddQuantity(&des_velocityX); + DesVelocityY des_velocityY("Qty_DesVelocity1",qty_map,1,QQ); qty_map.AddQuantity(&des_velocityY); + DesVelocityZ des_velocityZ("Qty_DesVelocity2",qty_map,1,QQ); qty_map.AddQuantity(&des_velocityZ); - VelocityAdj velocity_adj("Qty_VelocityAdj",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&velocity_adj); - PressureAdj pressure_adj("Qty_PressureAdj",qty_map,1,LL); qty_map.AddQuantity(&pressure_adj); - DesVelocity des_velocity("Qty_DesVelocity",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&des_velocity); - //consistency check - if (velocity._dim != des_velocity._dim) {std::cout << "main: inconsistency" << std::endl; abort();} - if (velocity._FEord != des_velocity._FEord) {std::cout << "main: inconsistency" << std::endl; abort();} + if (bhom._dim != Bext._dim) {std::cout << "main: inconsistency" << std::endl;abort();} + if (bhom._FEord != Bext._FEord) {std::cout << "main: inconsistency" << std::endl;abort();} +// if (velocity._dim != des_velocity._dim) {std::cout << "main: inconsistency" << std::endl; abort();} +// if (velocity._FEord != des_velocity._FEord) {std::cout << "main: inconsistency" << std::endl; abort();} //================================ //==== END Add QUANTITIES ======== @@ -186,20 +188,24 @@ int main(int argc, char** argv) { #if NS_EQUATIONS==1 SystemTwo & eqnNS = ml_prob.add_system("Eqn_NS"); - eqnNS.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHom"); - + eqnNS.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_Velocity"); + eqnNS.AddSolutionToSystemPDE("Qty_Pressure"); + eqnNS.AddUnknownToSystemPDE(&velocity); eqnNS.AddUnknownToSystemPDE(&pressure); + eqnNS.SetAssembleFunction(GenMatRhsNS); #endif #if NSAD_EQUATIONS==1 SystemTwo & eqnNSAD = ml_prob.add_system("Eqn_NSAD"); - eqnNSAD.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHom"); + eqnNSAD.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_VelocityAdj"); + eqnNSAD.AddSolutionToSystemPDE("Qty_PressureAdj"); eqnNSAD.AddUnknownToSystemPDE(&velocity_adj); eqnNSAD.AddUnknownToSystemPDE(&pressure_adj); + eqnNSAD.SetAssembleFunction(GenMatRhsNSAD); #endif @@ -207,29 +213,35 @@ int main(int argc, char** argv) { SystemTwo & eqnMHD = ml_prob.add_system("Eqn_MHD"); eqnMHD.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHom"); + eqnMHD.AddSolutionToSystemPDE("Qty_MagnFieldHomLagMult"); eqnMHD.AddUnknownToSystemPDE(&bhom); eqnMHD.AddUnknownToSystemPDE(&bhom_lag_mult); + eqnMHD.SetAssembleFunction(GenMatRhsMHD); #endif #if MHDAD_EQUATIONS==1 SystemTwo & eqnMHDAD = ml_prob.add_system("Eqn_MHDAD"); - eqnMHDAD.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHom"); + eqnMHDAD.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHomAdj"); + eqnMHDAD.AddSolutionToSystemPDE("Qty_MagnFieldHomLagMultAdj"); eqnMHDAD.AddUnknownToSystemPDE(&bhom_adj); eqnMHDAD.AddUnknownToSystemPDE(&bhom_lag_mult_adj); + eqnMHDAD.SetAssembleFunction(GenMatRhsMHDAD); #endif #if MHDCONT_EQUATIONS==1 SystemTwo & eqnMHDCONT = ml_prob.add_system("Eqn_MHDCONT"); - eqnMHDCONT.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHom"); + eqnMHDCONT.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldExt"); + eqnMHDCONT.AddSolutionToSystemPDE("Qty_MagnFieldExtLagMult"); eqnMHDCONT.AddUnknownToSystemPDE(&Bext); eqnMHDCONT.AddUnknownToSystemPDE(&Bext_lag_mult); + eqnMHDCONT.SetAssembleFunction(GenMatRhsMHDCONT); #endif From ae5c3a5f0c6cab2ebcbc0d528890c415d21c165d Mon Sep 17 00:00:00 2001 From: eaulisa Date: Fri, 3 Apr 2015 17:21:08 -0500 Subject: [PATCH 10/19] Ex3 PDE class --- applications/NumPdeSpring2015/Eugenio/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/applications/NumPdeSpring2015/Eugenio/CMakeLists.txt b/applications/NumPdeSpring2015/Eugenio/CMakeLists.txt index 482fcd056..93239845e 100644 --- a/applications/NumPdeSpring2015/Eugenio/CMakeLists.txt +++ b/applications/NumPdeSpring2015/Eugenio/CMakeLists.txt @@ -6,4 +6,7 @@ ADD_SUBDIRECTORY(${EXAMPLE_NUMBER}) set(EXAMPLE_NUMBER Ex2) ADD_SUBDIRECTORY(${EXAMPLE_NUMBER}) +set(EXAMPLE_NUMBER Ex3) +ADD_SUBDIRECTORY(${EXAMPLE_NUMBER}) + unset(EXAMPLE_NUMBER) From 76ab65e9de88809cc5b62f143c81b4b3f8df71dc Mon Sep 17 00:00:00 2001 From: Giorgio Bornia Date: Fri, 3 Apr 2015 18:45:51 -0500 Subject: [PATCH 11/19] Velocity is made out of scalars in mhdopt --- applications/OptimalControl/mhdopt/EqnMHD.cpp | 107 +++++-- .../OptimalControl/mhdopt/EqnMHDAD.cpp | 46 ++- .../OptimalControl/mhdopt/EqnMHDCONT.cpp | 45 ++- applications/OptimalControl/mhdopt/EqnNS.cpp | 80 +++-- .../OptimalControl/mhdopt/EqnNSAD.cpp | 60 ++-- .../OptimalControl/mhdopt/OptLoop.cpp | 37 ++- .../OptimalControl/mhdopt/OptQuantities.cpp | 301 ++++++++++++++---- .../OptimalControl/mhdopt/OptQuantities.hpp | 34 +- applications/OptimalControl/mhdopt/main.cpp | 16 +- applications/OptimalControl/tempopt/EqnNS.cpp | 5 +- src/equations/CurrentElem.cpp | 6 +- src/equations/CurrentElem.hpp | 2 +- 12 files changed, 542 insertions(+), 197 deletions(-) diff --git a/applications/OptimalControl/mhdopt/EqnMHD.cpp b/applications/OptimalControl/mhdopt/EqnMHD.cpp index afe11c71f..f17b0abe2 100644 --- a/applications/OptimalControl/mhdopt/EqnMHD.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHD.cpp @@ -33,8 +33,13 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr //========= reference values ========= const double IRem = 1./ml_prob.GetInputParser().get("Rem"); //============================ + +//======== GEOMETRICAL ELEMENT ======= + const uint space_dim = ml_prob._ml_msh->GetDimension(); //==== Operators @ gauss ======== + std::vector Vel_vec_val_g(space_dim); + std::vector Vel_vec_val_g3D(3); double vXBe_g3D[3]; double vXBeXdphii_g3D[3]; double curlBeXdphii_g3D[3]; @@ -44,13 +49,6 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr const double time = 0.; //ml_prob._timeloop._curr_time; -//======= TIME - STATIONARY OR NOT ======= - const int NonStatMHD = (int) ml_prob.GetInputParser().get("NonStatMHD"); - const double dt = 1.; //ml_prob._timeloop._timemap.get("dt"); - -//======== GEOMETRICAL ELEMENT ======= - const uint space_dim = ml_prob._ml_msh->GetDimension(); - my_system._LinSolver[Level]->_KK->zero(); my_system._LinSolver[Level]->_RESC->zero(); @@ -140,10 +138,25 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr Bext.Allocate(); #if VELOCITY_QTY==1 - CurrentQuantity Vel(currgp); - Vel._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity"); - Vel.VectWithQtyFillBasic(); - Vel.Allocate(); + CurrentQuantity VelX(currgp); + VelX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity0"); + VelX.VectWithQtyFillBasic(); + VelX.Allocate(); + + CurrentQuantity VelY(currgp); + VelY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity1"); + VelY.VectWithQtyFillBasic(); + VelY.Allocate(); + + CurrentQuantity VelZ(currgp); + VelZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity2"); + VelZ.VectWithQtyFillBasic(); + VelZ.Allocate(); + + std::vector Vel_vec; + Vel_vec.push_back(&VelX); + Vel_vec.push_back(&VelY); + Vel_vec.push_back(&VelZ); #endif //=========END EXTERNAL QUANTITIES (couplings) ===== @@ -169,9 +182,12 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); else Bext._qtyptr->FunctionDof(Bext,time,&xyz_refbox._val_dofs[0]); #endif -#if VELOCITY_QTY==1 - if ( Vel._eqnptr != NULL ) Vel.GetElemDofs(); //----- for Advection MAT & RHS - else Vel._qtyptr->FunctionDof(Vel,time,&xyz_refbox._val_dofs[0]); +#if VELOCITY_QTY==1 + //----- for Advection MAT & RHS + for (uint idim=0; idim < space_dim; idim++) { + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],time,&xyz_refbox._val_dofs[0]); + } #endif const uint el_ngauss = ml_prob.GetQrule(currelem.GetDim()).GetGaussPointsNumber(); @@ -184,7 +200,7 @@ for (uint fe = 0; fe < QL; fe++) { currgp.SetDPhiDxezetaElDofsFEVB_g (fe,qp); } - const double det = dt*currgp.JacVectVV_g(xyz); //InvJac: is unique! + const double det = currgp.JacVectVV_g(xyz); //InvJac: is unique! const double dtxJxW_g = det*ml_prob.GetQrule(currelem.GetDim()).GetGaussWeight(qp); const double detb = det/el_ngauss; @@ -197,7 +213,10 @@ for (uint fe = 0; fe < QL; fe++) { bhomOld.val_g(); //---for Time #if VELOCITY_QTY==1 - Vel.val_g(); //---- for Advection MAT & RHS + for (uint idim=0; idim < space_dim; idim++) { + Vel_vec[idim]->val_g(); //---- for Advection MAT & RHS + Vel_vec_val_g[idim] = Vel_vec[idim]->_val_g[0]; + } #endif #if BMAG_QTY==1 Bext.val_g(); //----- for Advection RHS @@ -206,9 +225,9 @@ for (uint fe = 0; fe < QL; fe++) { #endif #if (VELOCITY_QTY==1) && (BMAG_QTY==1) //in this case we have two couplings with external quantities - Math::extend(&Vel._val_g[0],&Vel._val_g3D[0],space_dim); //----- for Advection RHS + Math::extend(&Vel_vec_val_g[0],&Vel_vec_val_g3D[0],space_dim); //----- for Advection RHS Math::extend(&Bext._val_g[0],&Bext._val_g3D[0],space_dim); //----- for Advection RHS - Math::cross(&Vel._val_g3D[0],&Bext._val_g3D[0],vXBe_g3D); //----- for Advection RHS + Math::cross(&Vel_vec_val_g3D[0],&Bext._val_g3D[0],vXBe_g3D); //----- for Advection RHS #endif //================================ @@ -244,7 +263,6 @@ for (uint fe = 0; fe < QL; fe++) { const uint irowq = i + idim*bhomOld._ndof; currelem.Rhs()(irowq) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( - NonStatMHD*bhomOld._val_g[idim]*Phii._val_g[0]/dt //time - LAP_MHD*IRem*LapBe_g[idim] - (1-LAP_MHD)*IRem*curlBeXdphii_g3D[idim] //phii of bhomOld /*CurlCurl(RHS,vb,Phij,Phii,idim,idimp1);*/ + ADV_MHD* vXBeXdphii_g3D[idim] //phii of bhomOld @@ -270,17 +288,16 @@ for (uint fe = 0; fe < QL; fe++) { //--------- LAPLACIAN: Operator, MAT: grad b . grad phi --------------------- double Lap_g = Math::dot(&Phij._grad_g[0][0],&Phii._grad_g[0][0],space_dim); /*(i,j)*/ //part independent of idim //--------- ADVECTION: Operator, MAT: v x b . curl phi ------------------- - double Advphii_g = Math::dot( &Vel._val_g[0],&Phii._grad_g[0][0],space_dim); /*(i)*/ //part independent of idim //TODO what about putting it OUTSIDE? + double Advphii_g = Math::dot( &Vel_vec_val_g[0],&Phii._grad_g[0][0],space_dim); /*(i)*/ //part independent of idim //TODO what about putting it OUTSIDE? for (uint idim=0; idim_val_g[0] *Phii._grad_g[0][idim] ) //TODO Phij here does not depend on idim, but it depends on j ); // block +1 [2-6-7] int idimp1=(idim+1)%space_dim; @@ -289,7 +306,7 @@ for (uint fe = 0; fe < QL; fe++) { currelem.Mat()(irowq,j+idimp1*bhomOld._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( + (1-LAP_MHD)*IRem*( - Phij._grad_g[0][idim]*Phii._grad_g[0][idimp1] ) /*(i,j)*/ /*CurlCurl(MAT,vb,Phij,Phii,idim,idimp1);*/ - - ADV_MHD * Phij._val_g[0]* ( - Vel._val_g[idim] *Phii._grad_g[0][idimp1] ) /*(i,j)*/ /*AdvCurl(MAT,Vel,Phij,Phii,idim,idimp1)*/ + - ADV_MHD * Phij._val_g[0]* ( - Vel_vec[idim]->_val_g[0] * Phii._grad_g[0][idimp1] ) /*(i,j)*/ /*AdvCurl(MAT,Vel,Phij,Phii,idim,idimp1)*/ ); #if (DIMENSION==3) @@ -298,7 +315,7 @@ for (uint fe = 0; fe < QL; fe++) { currelem.Mat()(irowq,j+idimp2*bhomOld._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( + (1-LAP_MHD)*IRem*( - Phij._grad_g[0][idim]*Phii._grad_g[0][idimp2] ) /*(i,j)*/ - - ADV_MHD * Phij._val_g[0]* ( - Vel._val_g[idim] *Phii._grad_g[0][idimp2] ) /*(i,j)*/ + - ADV_MHD * Phij._val_g[0]* ( - Vel_vec[idim]->_val_g[0] *Phii._grad_g[0][idimp2] ) /*(i,j)*/ ); #endif } @@ -427,10 +444,25 @@ for (uint fe = 0; fe < QL; fe++) { Bext.Allocate(); #if VELOCITY_QTY==1 - CurrentQuantity Vel(currgp); - Vel._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity"); - Vel.VectWithQtyFillBasic(); - Vel.Allocate(); + CurrentQuantity VelX(currgp); + VelX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity0"); + VelX.VectWithQtyFillBasic(); + VelX.Allocate(); + + CurrentQuantity VelY(currgp); + VelY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity1"); + VelY.VectWithQtyFillBasic(); + VelY.Allocate(); + + CurrentQuantity VelZ(currgp); + VelZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity2"); + VelZ.VectWithQtyFillBasic(); + VelZ.Allocate(); + + std::vector Vel_vec; + Vel_vec.push_back(&VelX); + Vel_vec.push_back(&VelY); + Vel_vec.push_back(&VelZ); #endif //=========END EXTERNAL QUANTITIES (couplings) ===== @@ -459,7 +491,7 @@ for (uint fe = 0; fe < QL; fe++) { LagMultOld.GetElemDofs(); //============ BC ======= - int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(bhomOld,LagMultOld); + int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(bhomOld._ndof,space_dim,LagMultOld); //========END BC========= //========== EXTERNAL DOFS === @@ -468,8 +500,10 @@ for (uint fe = 0; fe < QL; fe++) { else Bext._qtyptr->FunctionDof(Bext,time,&xyz_refbox._val_dofs[0]); #endif #if VELOCITY_QTY==1 - if ( Vel._eqnptr != NULL ) Vel.GetElemDofs(); - else Vel._qtyptr->FunctionDof(Vel,time,&xyz_refbox._val_dofs[0]); + for (uint idim=0; idim < space_dim; idim++) { + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],time,&xyz_refbox._val_dofs[0]); + } #endif @@ -483,7 +517,7 @@ for (uint fe = 0; fe < QL; fe++) { currgp.SetDPhiDxezetaElDofsFEVB_g (fe,qp); } - const double det = dt * currgp.JacVectBB_g(xyz); + const double det = currgp.JacVectBB_g(xyz); const double dtxJxW_g = det * ml_prob.GetQrule(currelem.GetDim()).GetGaussWeight(qp); //=======end of the "COMMON SHAPE PART"=================================== @@ -493,15 +527,18 @@ for (uint fe = 0; fe < QL; fe++) { LagMultOld._qtyptr->Function_txyz(time,&xyz_refbox._val_g[0],&LagMultOld._val_g[0]); //check that you have ZERO here #if VELOCITY_QTY==1 - Vel.val_g(); + for (uint idim=0; idim < space_dim; idim++) { + Vel_vec[idim]->val_g(); + Vel_vec_val_g[idim] = Vel_vec[idim]->_val_g[0]; + } #endif #if BMAG_QTY==1 Bext.val_g(); #endif #if (VELOCITY_QTY==1) && (BMAG_QTY==1) - Math::extend( &Vel._val_g[0],&Vel._val_g3D[0],space_dim); + Math::extend(&Vel_vec_val_g[0],&Vel_vec_val_g3D[0],space_dim); Math::extend(&Bext._val_g[0],&Bext._val_g3D[0],space_dim); - Math::cross(&Vel._val_g3D[0],&Bext._val_g3D[0],velXBext_g3D); + Math::cross(&Vel_vec_val_g3D[0],&Bext._val_g3D[0],velXBext_g3D); Math::extend(currgp.get_normal_ptr(),normal_g3D,space_dim); Math::cross(velXBext_g3D,normal_g3D,velXBextXn_g3D); #endif diff --git a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp index 244def147..27bb0a95a 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp @@ -100,11 +100,26 @@ const int NonStatMHDAD = (int) ml_prob.GetInputParser().get("NonStatMHDAD"); xyz_refbox._ndof = myel->GetElementDofNumber(ZERO_ELEM,BIQUADR_FE); xyz_refbox.Allocate(); - //========== - CurrentQuantity Vel(currgp); - Vel._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity"); - Vel.VectWithQtyFillBasic(); - Vel.Allocate(); + //========== + CurrentQuantity VelX(currgp); + VelX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity0"); + VelX.VectWithQtyFillBasic(); + VelX.Allocate(); + + CurrentQuantity VelY(currgp); + VelY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity1"); + VelY.VectWithQtyFillBasic(); + VelY.Allocate(); + + CurrentQuantity VelZ(currgp); + VelZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity2"); + VelZ.VectWithQtyFillBasic(); + VelZ.Allocate(); + + std::vector Vel_vec; + Vel_vec.push_back(&VelX); + Vel_vec.push_back(&VelY); + Vel_vec.push_back(&VelZ); //========== CurrentQuantity VelAdj(currgp); @@ -150,8 +165,11 @@ const int NonStatMHDAD = (int) ml_prob.GetInputParser().get("NonStatMHDAD"); BhomAdjOld.GetElemDofs(); BhomLagMultAdjOld.GetElemDofs(); - if ( Vel._eqnptr != NULL ) Vel.GetElemDofs(); - else Vel._qtyptr->FunctionDof(Vel,time,&xyz_refbox._val_dofs[0]); + for (uint idim=0; idim < space_dim; idim++) { + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],time,&xyz_refbox._val_dofs[0]); + } + if ( VelAdj._eqnptr != NULL ) VelAdj.GetElemDofs(); else VelAdj._qtyptr->FunctionDof(VelAdj,time,&xyz_refbox._val_dofs[0]); if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); @@ -193,8 +211,9 @@ for (uint fe = 0; fe < QL; fe++) { BhomAdjOld.val_g(); Bmag.curl_g(); Bmag.val_g(); - Vel.val_g(); VelAdj.val_g(); + + for (uint idim=0; idimval_g(); //vector product Math::extend(&VelAdj._val_g[0],&VelAdj._val_g3D[0],space_dim); @@ -235,7 +254,8 @@ for (uint fe = 0; fe < QL; fe++) { //======= END "COMMON SHAPE PART for QTYZERO" ========== double Lap_g = Math::dot(dphijdx_g,dphiidx_g,space_dim); - double Advphij_g = Math::dot(&Vel._val_g[0],dphijdx_g,space_dim); + double Advphij_g = 0.; + for (uint idim=0; idim_val_g[0]*dphijdx_g[idim]; for (uint idim=0; idim_val_g[0] ) ); // block +1 [2-6-7] int idimp1=(idim+1)%space_dim; currelem.Mat()(irowq,j+idimp1*BhomAdjOld._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( + (1-LAP_MHD)*IRem*( -dphijdx_g[idim]* dphiidx_g[idimp1] ) - - phii_g*( -dphijdx_g[idim]*Vel._val_g[idimp1] ) + - phii_g*( -dphijdx_g[idim]*Vel_vec[idimp1]->_val_g[0] ) ); #if (DIMENSION==3) // block +2 [3-4-8] @@ -260,7 +280,7 @@ for (uint fe = 0; fe < QL; fe++) { currelem.Mat()(irowq,j+idimp2*BhomAdjOld._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( + (1-LAP_MHD)*IRem*(-dphijdx_g[idim]* dphiidx_g[idimp2] ) - - phii_g*( -dphijdx_g[idim]*Vel._val_g[idimp2] ) + - phii_g*( -dphijdx_g[idim]*Vel_vec[idimp2]->_val_g[0] ) ); #endif } @@ -374,7 +394,7 @@ for (uint fe = 0; fe < QL; fe++) { BhomLagMultAdjOld.GetElemDofs(); //============ BC ======= - int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(BhomAdjOld,BhomLagMultAdjOld); + int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(BhomAdjOld._ndof,space_dim,BhomLagMultAdjOld); //========END BC============ const uint el_ngauss = ml_prob.GetQrule(currelem.GetDim()).GetGaussPointsNumber(); diff --git a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp index 15c45699a..d0cd9887e 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp @@ -47,7 +47,9 @@ using namespace femus; const double gammaLap = ml_prob.GetInputParser().get("gammaLap"); //=========================== - //==== Operators @ gauss ======== //TODO USER + //==== Operators @ gauss ======== + std::vector Vel_vec_val_g(space_dim); + std::vector Vel_vec_val_g3D(3); double dphijdx_g[DIMENSION]; double dphiidx_g[DIMENSION]; double dphiidx_g3D[3]; @@ -108,10 +110,25 @@ using namespace femus; xyz_refbox.Allocate(); #if VELOCITY_QTY==1 - CurrentQuantity Vel(currgp); - Vel._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity"); //an alternative cannot exist, because it is an Unknown of This Equation - Vel.VectWithQtyFillBasic(); - Vel.Allocate(); + CurrentQuantity VelX(currgp); + VelX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity0"); + VelX.VectWithQtyFillBasic(); + VelX.Allocate(); + + CurrentQuantity VelY(currgp); + VelY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity1"); + VelY.VectWithQtyFillBasic(); + VelY.Allocate(); + + CurrentQuantity VelZ(currgp); + VelZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity2"); + VelZ.VectWithQtyFillBasic(); + VelZ.Allocate(); + + std::vector Vel_vec; + Vel_vec.push_back(&VelX); + Vel_vec.push_back(&VelY); + Vel_vec.push_back(&VelZ); #endif //================== @@ -149,9 +166,11 @@ using namespace femus; LagMultOld.GetElemDofs(); + for (uint idim=0; idim < space_dim; idim++) { + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],time,&xyz_refbox._val_dofs[0]); + } - if ( Vel._eqnptr != NULL ) Vel.GetElemDofs(); - else Vel._qtyptr->FunctionDof(Vel,time,&xyz_refbox._val_dofs[0]); if ( VelAdj._eqnptr != NULL ) VelAdj.GetElemDofs(); else VelAdj._qtyptr->FunctionDof(VelAdj,time,&xyz_refbox._val_dofs[0]); if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); @@ -187,16 +206,20 @@ for (uint fe = 0; fe < QL; fe++) { BhomAdj.curl_g(); Bhom.curl_g(); BeOld.val_g(); - Vel.val_g(); VelAdj.val_g(); Bhom.val_g(); BhomAdj.grad_g(); + for (uint idim=0; idimval_g(); + Vel_vec_val_g[idim] = Vel_vec[idim]->_val_g[0]; + } + // vector product - Math::extend( &Vel._val_g[0], &Vel._val_g3D[0],space_dim); + Math::extend( &Vel_vec_val_g[0], &Vel_vec_val_g3D[0],space_dim); Math::extend(&VelAdj._val_g[0],&VelAdj._val_g3D[0],space_dim); - Math::cross(&BhomAdj._curl_g3D[0], &Vel._val_g3D[0],curlxiXvel_g3D ); + Math::cross(&BhomAdj._curl_g3D[0], &Vel_vec_val_g3D[0],curlxiXvel_g3D ); Math::cross( &Bhom._curl_g3D[0],&VelAdj._val_g3D[0],curlbXlambda_g3D ); //========end preparation for things that are independent of (i,j) dofs of test and shape ===================== @@ -420,7 +443,7 @@ for (uint fe = 0; fe < QL; fe++) { LagMultOld.GetElemDofs(); //============ BC ======= - int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(BeOld,LagMultOld); + int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(BeOld._ndof,space_dim,LagMultOld); //========END BC============ //============================================================== diff --git a/applications/OptimalControl/mhdopt/EqnNS.cpp b/applications/OptimalControl/mhdopt/EqnNS.cpp index eee8719bd..3aa00ad4b 100644 --- a/applications/OptimalControl/mhdopt/EqnNS.cpp +++ b/applications/OptimalControl/mhdopt/EqnNS.cpp @@ -149,13 +149,28 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); CurrentGaussPointBase & currgp = CurrentGaussPointBase::build(currelem,ml_prob.GetQrule(currelem.GetDim())); //=========INTERNAL QUANTITIES (unknowns of the equation) ================== - CurrentQuantity VelOld(currgp); - VelOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity"); - VelOld.VectWithQtyFillBasic(); - VelOld.Allocate(); - - const uint qtyzero_ord = VelOld._FEord; - const uint qtyzero_ndof = VelOld._ndof; + CurrentQuantity VelOldX(currgp); + VelOldX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity0"); + VelOldX.VectWithQtyFillBasic(); + VelOldX.Allocate(); + + CurrentQuantity VelOldY(currgp); + VelOldY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity1"); + VelOldY.VectWithQtyFillBasic(); + VelOldY.Allocate(); + + CurrentQuantity VelOldZ(currgp); + VelOldZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity2"); + VelOldZ.VectWithQtyFillBasic(); + VelOldZ.Allocate(); + + std::vector VelOld_vec; + VelOld_vec.push_back(&VelOldX); + VelOld_vec.push_back(&VelOldY); + VelOld_vec.push_back(&VelOldZ); + + const uint qtyzero_ord = VelOldX._FEord; + const uint qtyzero_ndof = VelOldX._ndof; //========= CurrentQuantity pressOld(currgp); @@ -167,7 +182,7 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); const uint qtyone_ndof = pressOld._ndof; //order - const uint qtyZeroToOne_DofOffset = VelOld._ndof*VelOld._dim; + const uint qtyZeroToOne_DofOffset = VelOldX._ndof*space_dim; //========= END INTERNAL QUANTITIES (unknowns of the equation) ================= @@ -234,7 +249,8 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); //=======RETRIEVE the DOFS of the UNKNOWN QUANTITIES,i.e. MY EQUATION currelem.SetElDofsBc(); - VelOld.GetElemDofs(); + for (uint idim=0; idim < space_dim; idim++) VelOld_vec[idim]->GetElemDofs(); + pressOld.GetElemDofs(); //=======RETRIEVE the DOFS of the COUPLED QUANTITIES @@ -325,16 +341,19 @@ for (uint fe = 0; fe < QL; fe++) { //but, these quantities depend on idim and jdim, because they are involved in multiplications with tEST and SHAPE functions //Internal Quantities - VelOld.val_g(); //fills _val_g, needs _val_dofs - VelOld.grad_g(); //fills _grad_g, needs _val_dofs //TODO can we see the analogies between JacVectVV_g and grad_g? + for (uint idim=0; idim < space_dim; idim++) { + VelOld_vec[idim]->val_g(); + VelOld_vec[idim]->grad_g(); + } + //Advection all VelOld for (uint idim=0; idim_val_g[0]*VelOld_vec[idim]->_grad_g[0][b]; } } // grad is [ivar][idim], i.e. [u v w][x y z] //Divergence VelOld double Div_g=0.; - for (uint idim=0; idim_grad_g[0][idim]; #if (BMAG_QTY==1) //compute curlB @@ -370,7 +389,7 @@ for (uint fe = 0; fe < QL; fe++) { //(idim): component of the tEST function currelem.Rhs()(irowq) += currelem.GetBCDofFlag()[irowq]* - dtxJxW_g*( NonStatNS*rho_nd* VelOld._val_g[idim]*phii_g/dt //time + dtxJxW_g*( NonStatNS*rho_nd* VelOld_vec[idim]->_val_g[0]*phii_g/dt //time + _AdvNew_fl*rho_nd* AdvRhs_g[idim]*phii_g //TODO NONLIN + rho_nd*IFr*gravity._val_g[idim]*phii_g // gravity #if (BMAG_QTY==1) @@ -378,7 +397,7 @@ for (uint fe = 0; fe < QL; fe++) { + JextXB_g3D[idim]*phii_g #endif ) - + (1-currelem.GetBCDofFlag()[irowq])*detb*VelOld._val_dofs[irowq] //Dirichlet bc + + (1-currelem.GetBCDofFlag()[irowq])*detb*VelOld_vec[idim]->_val_dofs[i] //Dirichlet bc ; } @@ -396,7 +415,8 @@ for (uint fe = 0; fe < QL; fe++) { //======= END "COMMON SHAPE PART for QTYZERO" ========== double Lap_g=Math::dot(dphijdx_g,dphiidx_g,space_dim); - double Adv_g=Math::dot(&VelOld._val_g[0],dphijdx_g,space_dim); + double Adv_g=0.; + for (uint idim=0; idim_val_g[0] * dphijdx_g[idim]; // =Math::dot(&VelOld._val_g[0],dphijdx_g,space_dim); for (uint idim=0; idim_grad_g[0][idim]*phii_g //TODO NONLIN + _AdvPic_fl*_Stab_fl*rho_nd* 0.5*Div_g*phij_g*phii_g //TODO NONLIN + mu_nd*IRe*( dphijdx_g[idim]*dphiidx_g[idim] + Lap_g) ); @@ -418,7 +438,7 @@ for (uint fe = 0; fe < QL; fe++) { += currelem.GetBCDofFlag()[irowq]* dtxJxW_g*( - _AdvNew_fl*rho_nd*phij_g*VelOld._grad_g[idim][idimp1]*phii_g //TODO NONLIN + _AdvNew_fl*rho_nd*phij_g*VelOld_vec[idim]->_grad_g[0][idimp1]*phii_g //TODO NONLIN + mu_nd*IRe*( dphijdx_g[idim]*dphiidx_g[idimp1]) ); #if (DIMENSION==3) @@ -428,7 +448,7 @@ for (uint fe = 0; fe < QL; fe++) { += currelem.GetBCDofFlag()[irowq]* dtxJxW_g*( - _AdvNew_fl*rho_nd*phij_g*VelOld._grad_g[idim][idimp2]*phii_g //TODO NONLIN + _AdvNew_fl*rho_nd*phij_g*VelOld_vec[idim]->_grad_g[0][idimp2]*phii_g //TODO NONLIN + mu_nd*IRe*( dphijdx_g[idim]*dphiidx_g[idimp2]) ); #endif @@ -509,17 +529,17 @@ for (uint fe = 0; fe < QL; fe++) { CurrentGaussPointBase & currgp = CurrentGaussPointBase::build(currelem,ml_prob.GetQrule(currelem.GetDim())); //=========INTERNAL QUANTITIES (unknowns of the equation) ================== - CurrentQuantity VelOld(currgp); - VelOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYZERO]; //an alternative cannot exist, because it is an Unknown of This Equation - VelOld.VectWithQtyFillBasic(); //the internal quantities will eventually have *this as eqn pointer - VelOld.Allocate(); + CurrentQuantity VelOldX(currgp); + VelOldX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity0"); + VelOldX.VectWithQtyFillBasic(); + VelOldX.Allocate(); - const uint qtyzero_ord = VelOld._FEord; - const uint qtyzero_ndof = VelOld._ndof; + const uint qtyzero_ord = VelOldX._FEord; + const uint qtyzero_ndof = VelOldX._ndof; //========= CurrentQuantity pressOld(currgp); - pressOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYONE]; + pressOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Pressure"); pressOld.VectWithQtyFillBasic(); pressOld.Allocate(); @@ -527,7 +547,7 @@ for (uint fe = 0; fe < QL; fe++) { const uint qtyone_ndof = pressOld._ndof; //order - const uint qtyZeroToOne_DofOffset = VelOld._ndof*VelOld._dim; + const uint qtyZeroToOne_DofOffset = VelOldX._ndof*space_dim; //========= END INTERNAL QUANTITIES (unknowns of the equation) ================= @@ -565,11 +585,10 @@ for (uint fe = 0; fe < QL; fe++) { currelem.SetElDofsBc(); - VelOld.GetElemDofs(); pressOld.GetElemDofs(); //============ BC ======= - int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(VelOld,pressOld); + int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(VelOldX._ndof,space_dim,pressOld); //========END BC============ //============================================================== @@ -593,9 +612,6 @@ for (uint fe = 0; fe < QL; fe++) { pressOld._qtyptr->Function_txyz(time,&xyz_refbox._val_g[0],&pressOld._val_g[0]); //i prefer using the function instead of the p_old vector // pressOld.val_g(); //this is the alternative - VelOld.val_g(); - - //============================================================== //========= FILLING ELEMENT MAT/RHS (i loop) ==================== //============================================================== diff --git a/applications/OptimalControl/mhdopt/EqnNSAD.cpp b/applications/OptimalControl/mhdopt/EqnNSAD.cpp index 5d7045dea..d9220c008 100644 --- a/applications/OptimalControl/mhdopt/EqnNSAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnNSAD.cpp @@ -99,12 +99,31 @@ const int NonStatNSAD = (int) ml_prob.GetInputParser().get("NonStatNSAD"); xyz_refbox._ndof = myel->GetElementDofNumber(ZERO_ELEM,BIQUADR_FE); xyz_refbox.Allocate(); - CurrentQuantity Vel(currgp); - Vel._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity"); - Vel.VectWithQtyFillBasic(); - Vel.Allocate(); - + + CurrentQuantity VelX(currgp); + VelX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity0"); + VelX.VectWithQtyFillBasic(); + VelX.Allocate(); + + CurrentQuantity VelY(currgp); + VelY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity1"); + VelY.VectWithQtyFillBasic(); + VelY.Allocate(); + + CurrentQuantity VelZ(currgp); + VelZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity2"); + VelZ.VectWithQtyFillBasic(); + VelZ.Allocate(); + + std::vector Vel_vec; + Vel_vec.push_back(&VelX); + Vel_vec.push_back(&VelY); + Vel_vec.push_back(&VelZ); + + + + CurrentQuantity VelDesX(currgp); VelDesX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_DesVelocity0"); VelDesX.VectWithQtyFillBasic(); @@ -167,8 +186,6 @@ const int NonStatNSAD = (int) ml_prob.GetInputParser().get("NonStatNSAD"); VelAdjOld.GetElemDofs(); PressAdjOld.GetElemDofs(); - if ( Vel._eqnptr != NULL ) Vel.GetElemDofs(); - else Vel._qtyptr->FunctionDof(Vel,time,&xyz_refbox._val_dofs[0]); //give the Hartmann flow, if not solving NS if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); else Bhom._qtyptr->FunctionDof(Bhom,time,&xyz_refbox._val_dofs[0]); if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); @@ -177,8 +194,10 @@ const int NonStatNSAD = (int) ml_prob.GetInputParser().get("NonStatNSAD"); else BhomAdj._qtyptr->FunctionDof(BhomAdj,time,&xyz_refbox._val_dofs[0]); for (uint idim=0; idim < space_dim; idim++) { + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],time,&xyz_refbox._val_dofs[0]); //give the Hartmann flow, if not solving NS if ( VelDes_vec[idim]->_eqnptr != NULL ) VelDes_vec[idim]->GetElemDofs(); - else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],time,&xyz_refbox._val_dofs[0]); + else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],time,&xyz_refbox._val_dofs[0]); } //======SUM Bhom and Bext //from now on, you'll only use Bmag //Bmag,Bext and Bhom must have the same orders! @@ -221,11 +240,13 @@ for (uint fe = 0; fe < QL; fe++) { VelAdjOld.val_g(); BhomAdj.curl_g(); Bmag.val_g(); - Vel.val_g(); - Vel.grad_g(); - - for (uint idim=0; idim < space_dim; idim++) VelDes_vec[idim]->val_g(); - + + for (uint idim=0; idim < space_dim; idim++) { + VelDes_vec[idim]->val_g(); + Vel_vec[idim]->val_g(); + Vel_vec[idim]->grad_g(); + } + //vector product Math::extend(&Bmag._val_g[0],&Bmag._val_g3D[0],space_dim); Math::cross(&BhomAdj._curl_g3D[0],&Bmag._val_g3D[0],curlxiXB_g3D); @@ -244,7 +265,7 @@ for (uint fe = 0; fe < QL; fe++) { currelem.Rhs()(irowq) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( NonStatNSAD*VelAdjOld._val_g[idim]*phii_g/dt //time - curlxiXB_g3D[idim]*phii_g //this is due to the variation of velocity in the MAGNETIC ADVECTION, so it is due to a NONLINEAR COUPLING "u times B", "MY_STATE times OTHER_STATE" - - alphaVel*el_flagdom*(Vel._val_g[idim] - VelDes_vec[idim]->_val_g[0])*phii_g //this is the dependence that counts + - alphaVel*el_flagdom*(Vel_vec[idim]->_val_g[0] - VelDes_vec[idim]->_val_g[0])*phii_g //this is the dependence that counts ) + (1-currelem.GetBCDofFlag()[irowq])*detb*VelAdjOld._val_dofs[irowq]; //Dirichlet bc } @@ -261,7 +282,8 @@ for (uint fe = 0; fe < QL; fe++) { //======= END "COMMON SHAPE PART for QTYZERO" ========== double Lap_g = Math::dot(dphijdx_g,dphiidx_g,space_dim); - double Advphii_g = Math::dot(&Vel._val_g[0],dphiidx_g,space_dim); //TODO can put it outside + double Advphii_g = 0.; + for (uint idim=0; idim_val_g[0]*dphiidx_g[idim]; //TODO can put it outside for (uint idim=0; idim_grad_g[0][idim] //Adjoint of Advection 1 delta(u) DOT grad(u): adj of nonlinear stuff has 2 TERMS (well, not always) + phij_g*Advphii_g //Adjoint of Advection 2 u DOT grad (delta(u)): adj of nonlinear stuff has 2 TERMS ); // block +1 [2-6-7] @@ -278,7 +300,7 @@ for (uint fe = 0; fe < QL; fe++) { currelem.Mat()(irowq,j+idimp1*VelAdjOld._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( + IRe*(dphijdx_g[idim]*dphiidx_g[idimp1]) - + phij_g*phii_g*/*dveldx_g*/Vel._grad_g[idimp1][idim] + + phij_g*phii_g*/*dveldx_g*/Vel_vec[idimp1]->_grad_g[0][idim] ); #if (DIMENSION==3) // block +2 [3-4-8] @@ -286,7 +308,7 @@ for (uint fe = 0; fe < QL; fe++) { currelem.Mat()(irowq,j+idimp2*VelAdjOld._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( + IRe*(dphijdx_g[idim]*dphiidx_g[idimp2]) - + phij_g*phii_g*/*dveldx_g*/Vel._grad_g[idimp2][idim] + + phij_g*phii_g*/*dveldx_g*/Vel_vec[idimp2]->_grad_g[0][idim] ); #endif } @@ -398,7 +420,7 @@ for (uint fe = 0; fe < QL; fe++) { PressAdjOld.GetElemDofs(); //============ BC ======= - int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(VelAdjOld,PressAdjOld); + int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(VelAdjOld._ndof,space_dim,PressAdjOld); //========END BC============ //============================================================== diff --git a/applications/OptimalControl/mhdopt/OptLoop.cpp b/applications/OptimalControl/mhdopt/OptLoop.cpp index 5ffd9d7be..e06b56a2a 100644 --- a/applications/OptimalControl/mhdopt/OptLoop.cpp +++ b/applications/OptimalControl/mhdopt/OptLoop.cpp @@ -544,10 +544,25 @@ double ComputeIntegral (const uint Level, const MultiLevelMeshTwo* mesh, const S xyz_refbox.Allocate(); //========== - CurrentQuantity Vel(currgp); - Vel._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_Velocity"); - Vel.VectWithQtyFillBasic(); - Vel.Allocate(); + CurrentQuantity VelX(currgp); + VelX._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_Velocity0"); + VelX.VectWithQtyFillBasic(); + VelX.Allocate(); + + CurrentQuantity VelY(currgp); + VelY._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_Velocity1"); + VelY.VectWithQtyFillBasic(); + VelY.Allocate(); + + CurrentQuantity VelZ(currgp); + VelZ._qtyptr = eqn->GetMLProb().GetQtyMap().GetQuantity("Qty_Velocity2"); + VelZ.VectWithQtyFillBasic(); + VelZ.Allocate(); + + std::vector Vel_vec; + Vel_vec.push_back(&VelX); + Vel_vec.push_back(&VelY); + Vel_vec.push_back(&VelZ); //========== CurrentQuantity VelDesX(currgp); @@ -586,12 +601,12 @@ double ComputeIntegral (const uint Level, const MultiLevelMeshTwo* mesh, const S int el_flagdom = ElFlagControl(xyz_refbox._el_average,eqn->GetMLProb()._ml_msh); //======= - if ( Vel._eqnptr != NULL ) Vel.GetElemDofs(); - else Vel._qtyptr->FunctionDof(Vel,0./*time*/,&xyz_refbox._val_dofs[0]); //give the Hartmann flow, if not solving NS - for (uint idim=0; idim < space_dim; idim++) { + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); //give the Hartmann flow, if not solving NS if ( VelDes_vec[idim]->_eqnptr != NULL ) VelDes_vec[idim]->GetElemDofs(); else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],0,&xyz_refbox._val_dofs[0]); + } //AAA time is picked as a function pointer of the time C library i think... @@ -608,12 +623,14 @@ for (uint fe = 0; fe < QL; fe++) { currgp.SetDPhiDxezetaElDofsFEVB_g (fe,qp for (uint fe = 0; fe < QL; fe++) { currgp.SetPhiElDofsFEVB_g (fe,qp); } - Vel.val_g(); - for (uint idim=0; idim < space_dim; idim++) VelDes_vec[idim]->val_g(); + for (uint idim=0; idim < space_dim; idim++) { + Vel_vec[idim]->val_g(); + VelDes_vec[idim]->val_g(); + } double deltau_squarenorm_g = 0.; -for (uint j=0; j_val_g[0])*(Vel._val_g[j] - VelDes_vec[j]->_val_g[0]); } +for (uint j=0; j_val_g[0] - VelDes_vec[j]->_val_g[0])*(Vel_vec[j]->_val_g[0] - VelDes_vec[j]->_val_g[0]); } //NO for (uint j=0; jget("Uref"); + +} + +//========================================================================= +VelocityY::VelocityY(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) +: Quantity(name_in,qtymap_in,dim_in,FEord_in) { + + for (uint i=0;iget("Uref"); + +} + +//========================================================================= +VelocityZ::VelocityZ(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) : Quantity(name_in,qtymap_in,dim_in,FEord_in) { for (uint i=0;iget("Uref"); @@ -142,11 +158,7 @@ DesVelocityZ::DesVelocityZ(std::string name_in, QuantityMap& qtymap_in, uint dim //============================================================= -///analytical velocity for Hartmann flow -// difference between get_par and optsys: -// in both cases you are "dynamic" somehow - -void Velocity::Function_txyz(const double t,const double* xp, double* func) const { +void VelocityX::Function_txyz(const double t,const double* xp, double* func) const { Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); // we should do this static_cast in the QUANTITY or QUANTITY MAP constructor @@ -186,13 +198,104 @@ void Velocity::Function_txyz(const double t,const double* xp, double* func) cons func[0] = -sin(thetaz)*magnitude/*/Uref*/; - func[1] = cos(thetaz)*magnitude; - //add a 4. to the denominator - //should check the difference between L and Lref - //TODO check this nondimensionalization -#if (DIMENSION==3) - func[2] = 0./*/Uref*/; -#endif + + return; + + +} + + + +//============================================================= +void VelocityY::Function_txyz(const double t,const double* xp, double* func) const { + + Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + // we should do this static_cast in the QUANTITY or QUANTITY MAP constructor + //if there is some domain shape, we see what type it is and we do the static cast + //if there is no domain shape, we dont need the domain. + + //=====ROTATION of the Function + const double thetaz = box->_domain_rtmap.get("thetaz"); + + const double rhof = _qtymap.GetInputParser()->get("rho0"); + const double Uref = _qtymap.GetInputParser()->get("Uref"); + const double muvel = _qtymap.GetInputParser()->get("mu0"); + const double MUMHD = _qtymap.GetInputParser()->get("MUMHD"); + const double SIGMHD = _qtymap.GetInputParser()->get("SIGMHD"); + const double Bref = _qtymap.GetInputParser()->get("Bref"); + const double Lref = _qtymap.GetInputParser()->get("Lref"); + + const double DpDz = 1./*0.5*/; //AAA: change it according to the pressure distribution!!! + + double DpDzad = DpDz*Lref/(rhof*Uref*Uref); + + double Re = _qtymap.GetInputParser()->get("Re"); + double Rem = _qtymap.GetInputParser()->get("Rem"); + double Hm = _qtymap.GetInputParser()->get("Hm"); + double S = _qtymap.GetInputParser()->get("S"); + + + double Lhalf = 0.5*(box->_le[0] - box->_lb[0]); + double Lmid = 0.5*(box->_le[0] + box->_lb[0]); + + double xtr = xp[0] - Lmid/*/Lref*/; + + + //constant for the real reference length in the Hartmann number + const double LHm =2.; //this is because the reference length for Hm is HALF THE WIDTH of the domain, which is Lref=1 now + const double magnitude = DpDzad*Hm/LHm*(cosh(Hm/LHm) - cosh(Hm/LHm*xtr*Lref/Lhalf)) / (SIGMHD*Bref*Bref*sinh(Hm/LHm)*Uref); + + + func[0] = cos(thetaz)*magnitude; + + return; + + +} + + + +//============================================================= +void VelocityZ::Function_txyz(const double t,const double* xp, double* func) const { + + Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + // we should do this static_cast in the QUANTITY or QUANTITY MAP constructor + //if there is some domain shape, we see what type it is and we do the static cast + //if there is no domain shape, we dont need the domain. + + //=====ROTATION of the Function + const double thetaz = box->_domain_rtmap.get("thetaz"); + + const double rhof = _qtymap.GetInputParser()->get("rho0"); + const double Uref = _qtymap.GetInputParser()->get("Uref"); + const double muvel = _qtymap.GetInputParser()->get("mu0"); + const double MUMHD = _qtymap.GetInputParser()->get("MUMHD"); + const double SIGMHD = _qtymap.GetInputParser()->get("SIGMHD"); + const double Bref = _qtymap.GetInputParser()->get("Bref"); + const double Lref = _qtymap.GetInputParser()->get("Lref"); + + const double DpDz = 1./*0.5*/; //AAA: change it according to the pressure distribution!!! + + double DpDzad = DpDz*Lref/(rhof*Uref*Uref); + + double Re = _qtymap.GetInputParser()->get("Re"); + double Rem = _qtymap.GetInputParser()->get("Rem"); + double Hm = _qtymap.GetInputParser()->get("Hm"); + double S = _qtymap.GetInputParser()->get("S"); + + + double Lhalf = 0.5*(box->_le[0] - box->_lb[0]); + double Lmid = 0.5*(box->_le[0] + box->_lb[0]); + + double xtr = xp[0] - Lmid/*/Lref*/; + + + //constant for the real reference length in the Hartmann number + const double LHm =2.; //this is because the reference length for Hm is HALF THE WIDTH of the domain, which is Lref=1 now + const double magnitude = DpDzad*Hm/LHm*(cosh(Hm/LHm) - cosh(Hm/LHm*xtr*Lref/Lhalf)) / (SIGMHD*Bref*Bref*sinh(Hm/LHm)*Uref); + + + func[0] = 0./*/Uref*/; return; @@ -600,7 +703,7 @@ void MagnFieldHomAdj::Function_txyz(const double t, const double* xp,double* fun // ======================================================== -void Velocity::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { +void VelocityX::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { const double bdry_toll = DEFAULT_BDRY_TOLL; @@ -621,71 +724,136 @@ Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); -#if (DIMENSION==2) - - if ( (x_rotshift[0]) > -bdry_toll && ( x_rotshift[0]) < bdry_toll ) {//left of the RefBox - bc_flag[0]=0; - bc_flag[1]=0; + if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { //left of the RefBox + bc_flag[0]=0; //u dot n } - - if ( (le[0]-lb[0]) -(x_rotshift[0]) > -bdry_toll && (le[0]-lb[0]) -(x_rotshift[0]) < bdry_toll){ //right of the RefBox - bc_flag[0]=0; - bc_flag[1]=0; + + if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll ) { //right of the RefBox + bc_flag[0]=0; //u dot n } - if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { //bottom of the RefBox - bc_flag[0]=0; //u dot t -// bc_flag[1]=0; + if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll ) { //bottom of the RefBox + bc_flag[0]=0; //u x n } - if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { //top of the of the RefBox - bc_flag[0]=0; -// bc_flag[1]=0; + if ( (le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll ) { //top of the of the RefBox + bc_flag[0]=0; //u x n } + if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n //check it for all equations + } + + if ( (le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll ) { + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n + } + + + + + return; + +} + + + +void VelocityY::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { + + const double bdry_toll = DEFAULT_BDRY_TOLL; + +Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + + std::vector lb(_qtymap.GetMeshTwo()->get_dim()); + std::vector le(_qtymap.GetMeshTwo()->get_dim()); + lb[0] = box->_lb[0]; //already nondimensionalized + le[0] = box->_le[0]; + lb[1] = box->_lb[1]; + le[1] = box->_le[1]; + if (_qtymap.GetMeshTwo()->get_dim() == 3) { + lb[2] = box->_lb[2]; + le[2] = box->_le[2]; + } + + std::vector x_rotshift(_qtymap.GetMeshTwo()->get_dim()); + _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); -#elif (DIMENSION==3) if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { //left of the RefBox - bc_flag[0]=0; //u dot n - bc_flag[1]=0; //u x n - bc_flag[2]=0; //u x n + bc_flag[0]=0; //u x n } if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll ) { //right of the RefBox - bc_flag[0]=0; //u dot n - bc_flag[1]=0; //u x n - bc_flag[2]=0; //u x n + bc_flag[0]=0; //u x n } if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll ) { //bottom of the RefBox - bc_flag[0]=0; //u x n -// bc_flag[1]=0; //u dot n //leave this free for VELOCITY INLET - bc_flag[2]=0; //u x n +// bc_flag[0]=0; //u dot n //leave this free for VELOCITY INLET } if ( (le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll ) { //top of the of the RefBox - bc_flag[0]=0; //u x n -// bc_flag[1]=0; //u dot n //leave this free for outlet - bc_flag[2]=0; //u x n +// bc_flag[0]=0; //u dot n //leave this free for outlet } if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { - if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n //check it for all equations - if (bc_flag[1] == 1) bc_flag[1] = _qtymap.GetInputParser()->get("Fake3D"); //u x n //leave this free for 2D - bc_flag[2]=0; //u dot n + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n //leave this free for 2D } if ( (le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll ) { - if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n - if (bc_flag[1] == 1) bc_flag[1] = _qtymap.GetInputParser()->get("Fake3D"); //u x n //leave this free for 2D - bc_flag[2] = 0; //u dot n + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n //leave this free for 2D } - #endif + + return; + +} + + + +void VelocityZ::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { + const double bdry_toll = DEFAULT_BDRY_TOLL; + +Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + + std::vector lb(_qtymap.GetMeshTwo()->get_dim()); + std::vector le(_qtymap.GetMeshTwo()->get_dim()); + lb[0] = box->_lb[0]; //already nondimensionalized + le[0] = box->_le[0]; + lb[1] = box->_lb[1]; + le[1] = box->_le[1]; + if (_qtymap.GetMeshTwo()->get_dim() == 3) { + lb[2] = box->_lb[2]; + le[2] = box->_le[2]; + } + std::vector x_rotshift(_qtymap.GetMeshTwo()->get_dim()); + _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); + + + if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { //left of the RefBox + bc_flag[0]=0; //u x n + } + + if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll ) { //right of the RefBox + bc_flag[0]=0; //u x n + } + + if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll ) { //bottom of the RefBox + bc_flag[0]=0; //u x n + } + + if ( (le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll ) { //top of the of the RefBox + bc_flag[0]=0; //u x n + } + + if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { + bc_flag[0]=0; //u dot n + } + + if ( (le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll ) { + bc_flag[0] = 0; //u dot n + } return; @@ -1447,7 +1615,18 @@ void MagnFieldExtLagMult::bc_flag_txyz(const double t, const double* xp, std::ve // ===================== INITIAL CONDITIONS ============================ // ===================================================================== -void Velocity::initialize_xyz(const double* xp, std::vector< double >& value) const { +void VelocityX::initialize_xyz(const double* xp, std::vector< double >& value) const { + + value[0] = 0.; + + return; +} + + + + + +void VelocityY::initialize_xyz(const double* xp, std::vector< double >& value) const { const double Uref = _qtymap.GetInputParser()->get("Uref"); const double pref = _qtymap.GetInputParser()->get("pref"); @@ -1474,27 +1653,27 @@ void Velocity::initialize_xyz(const double* xp, std::vector< double >& value) co //rotation of the function double thetaz = box->_domain_rtmap.get("thetaz"); + value[0] = 0.; + + if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { value[0] = (x_rotshift[0] - lb[0])*(le[0] - x_rotshift[0])*(x_rotshift[2] - lb[2])*(le[2]-x_rotshift[2])/Uref; } -#if (DIMENSION==2) + + return; +} -const double magnitude = /*udes**/1.*(x_rotshift[0] - box->_lb[0])*(box->_le[0]-x_rotshift[0] )/( Uref); - value[0] = -sin(thetaz)*magnitude; - value[1] = cos(thetaz)*magnitude; -#elif (DIMENSION==3) - value[0] = 0.; - value[1] = 0.*/*udes**/(x_rotshift[0] - box->_lb[0])*(box->_le[0]-x_rotshift[0] )/( Uref); - value[2] = 0.; +void VelocityZ::initialize_xyz(const double* xp, std::vector< double >& value) const { - if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { value[1] = (x_rotshift[0] - lb[0])*(le[0] - x_rotshift[0])*(x_rotshift[2] - lb[2])*(le[2]-x_rotshift[2])/Uref; } - -#endif + value[0] = 0.; return; } + + + void Pressure::initialize_xyz(const double* xp, std::vector< double >& value) const { Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); diff --git a/applications/OptimalControl/mhdopt/OptQuantities.hpp b/applications/OptimalControl/mhdopt/OptQuantities.hpp index b217a78f9..daa718eae 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.hpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.hpp @@ -130,12 +130,11 @@ class PressureAdj : public Quantity { }; -class Velocity : public Quantity { +class VelocityX : public Quantity { public: - Velocity(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~Velocity(){}; + VelocityX(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; @@ -143,6 +142,35 @@ class Velocity : public Quantity { }; + +class VelocityY : public Quantity { + + public: + + VelocityY(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; + void initialize_xyz(const double* xp, std::vector & value) const; + +}; + + +class VelocityZ : public Quantity { + + public: + + VelocityZ(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; + void initialize_xyz(const double* xp, std::vector & value) const; + +}; + + + + class VelocityAdj : public Quantity { public: diff --git a/applications/OptimalControl/mhdopt/main.cpp b/applications/OptimalControl/mhdopt/main.cpp index 4ebc7232d..670e86e4c 100644 --- a/applications/OptimalControl/mhdopt/main.cpp +++ b/applications/OptimalControl/mhdopt/main.cpp @@ -114,14 +114,14 @@ int main(int argc, char** argv) { //================================ // ======= Add QUANTITIES ======== //================================ - MagnFieldHom bhom("Qty_MagnFieldHom",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom); - MagnFieldExt Bext("Qty_MagnFieldExt",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&Bext); - - MagnFieldHomAdj bhom_adj("Qty_MagnFieldHomAdj",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom_adj); - - Velocity velocity("Qty_Velocity",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&velocity); + VelocityX velocityX("Qty_Velocity0",qty_map,1,QQ); qty_map.AddQuantity(&velocityX); + VelocityY velocityY("Qty_Velocity1",qty_map,1,QQ); qty_map.AddQuantity(&velocityY); + VelocityZ velocityZ("Qty_Velocity2",qty_map,1,QQ); qty_map.AddQuantity(&velocityZ); VelocityAdj velocity_adj("Qty_VelocityAdj",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&velocity_adj); + MagnFieldHom bhom("Qty_MagnFieldHom",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom); + MagnFieldExt Bext("Qty_MagnFieldExt",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&Bext); + MagnFieldHomAdj bhom_adj("Qty_MagnFieldHomAdj",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom_adj); MagnFieldHomLagMult bhom_lag_mult("Qty_MagnFieldHomLagMult",qty_map,1,LL); qty_map.AddQuantity(&bhom_lag_mult); MagnFieldExtLagMult Bext_lag_mult("Qty_MagnFieldExtLagMult",qty_map,1,LL); qty_map.AddQuantity(&Bext_lag_mult); @@ -191,7 +191,9 @@ int main(int argc, char** argv) { eqnNS.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_Velocity"); eqnNS.AddSolutionToSystemPDE("Qty_Pressure"); - eqnNS.AddUnknownToSystemPDE(&velocity); + eqnNS.AddUnknownToSystemPDE(&velocityX); + eqnNS.AddUnknownToSystemPDE(&velocityY); + eqnNS.AddUnknownToSystemPDE(&velocityZ); eqnNS.AddUnknownToSystemPDE(&pressure); eqnNS.SetAssembleFunction(GenMatRhsNS); diff --git a/applications/OptimalControl/tempopt/EqnNS.cpp b/applications/OptimalControl/tempopt/EqnNS.cpp index 44dacd8d1..d2e06a4f7 100644 --- a/applications/OptimalControl/tempopt/EqnNS.cpp +++ b/applications/OptimalControl/tempopt/EqnNS.cpp @@ -263,8 +263,9 @@ for (uint fe = 0; fe < QL; fe++) { //======= END "COMMON SHAPE PART for QTYZERO" ========== double Lap_g = Math::dot(&dphijdx_g[0],&dphiidx_g[0],space_dim); - double Adv_g = VelOld_vec[0]->_val_g[0] * dphijdx_g[0] + VelOld_vec[1]->_val_g[0] * dphijdx_g[1]; //Math::dot(&VelOld._val_g[0],&dphijdx_g[0],space_dim); - + double Adv_g=0.; + for (uint idim=0; idim_val_g[0] * dphijdx_g[idim]; // =Math::dot(&VelOld._val_g[0],dphijdx_g,space_dim); + for (uint idim=0; idim & GetElemTypeVectorFE() const { return _elem_type; } /** */ - int Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(const CurrentQuantity &Velold_in,const CurrentQuantity& press_in) const; + int Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(const uint ndof_in, const uint space_dim, const CurrentQuantity& press_in) const; void TransformElemNodesToRef(Domain* mydom, double* refbox_xyz); From d2f28aff204437fa95216959c797a9270916ec51 Mon Sep 17 00:00:00 2001 From: eaulisa Date: Sat, 4 Apr 2015 10:24:09 -0500 Subject: [PATCH 12/19] added ex3 --- .../input/drum2.neu | 277 +++++++ .../input/gambit/drum2.dbs | Bin 0 -> 176128 bytes .../input/gambit/drum2.neu | 277 +++++++ .../input/gambit/piston.dbs | Bin 0 -> 180224 bytes .../input/gambit/piston.neu | 307 ++++++++ .../Eugenio/Ex3/CMakeLists.txt | 9 + .../NumPdeSpring2015/Eugenio/Ex3/Ex3.cpp | 737 ++++++++++++++++++ .../Eugenio/Ex3/input/cube_hex.neu | 205 +++++ .../Eugenio/Ex3/input/cube_mixed.neu | 226 ++++++ .../Eugenio/Ex3/input/cube_tet.neu | 75 ++ .../Eugenio/Ex3/input/cube_wedge.neu | 230 ++++++ .../Eugenio/Ex3/input/gambit/cube_hex.dbs | Bin 0 -> 151552 bytes .../Eugenio/Ex3/input/gambit/cube_mixed.dbs | Bin 0 -> 311296 bytes .../Eugenio/Ex3/input/gambit/cube_mixed.lok | 1 + .../Eugenio/Ex3/input/gambit/cube_tet.dbs | Bin 0 -> 204800 bytes .../Eugenio/Ex3/input/gambit/cube_wedge.dbs | Bin 0 -> 151552 bytes .../Eugenio/Ex3/input/gambit/square_mixed.dbs | Bin 0 -> 139264 bytes .../Eugenio/Ex3/input/gambit/square_quad.dbs | Bin 0 -> 131072 bytes .../Eugenio/Ex3/input/gambit/square_tri.dbs | Bin 0 -> 131072 bytes .../Eugenio/Ex3/input/gambit/tet.dbs | Bin 0 -> 135168 bytes .../Eugenio/Ex3/input/square_mixed.neu | 62 ++ .../Eugenio/Ex3/input/square_quad.neu | 62 ++ .../Eugenio/Ex3/input/square_tri.neu | 62 ++ 23 files changed, 2530 insertions(+) create mode 100644 applications/FSI/FSITimeDependentBenchmarks/input/drum2.neu create mode 100644 applications/FSI/FSITimeDependentBenchmarks/input/gambit/drum2.dbs create mode 100644 applications/FSI/FSITimeDependentBenchmarks/input/gambit/drum2.neu create mode 100644 applications/FSI/FSITimeDependentBenchmarks/input/gambit/piston.dbs create mode 100644 applications/FSI/FSITimeDependentBenchmarks/input/gambit/piston.neu create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/CMakeLists.txt create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/Ex3.cpp create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_hex.neu create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_mixed.neu create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_tet.neu create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_wedge.neu create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_hex.dbs create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_mixed.dbs create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_mixed.lok create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_tet.dbs create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_wedge.dbs create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/square_mixed.dbs create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/square_quad.dbs create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/square_tri.dbs create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/tet.dbs create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/square_mixed.neu create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/square_quad.neu create mode 100644 applications/NumPdeSpring2015/Eugenio/Ex3/input/square_tri.neu diff --git a/applications/FSI/FSITimeDependentBenchmarks/input/drum2.neu b/applications/FSI/FSITimeDependentBenchmarks/input/drum2.neu new file mode 100644 index 000000000..d38cfbb77 --- /dev/null +++ b/applications/FSI/FSITimeDependentBenchmarks/input/drum2.neu @@ -0,0 +1,277 @@ + CONTROL INFO 2.3.16 +** GAMBIT NEUTRAL FILE +drum2 +PROGRAM: Gambit VERSION: 2.3.16 +31 Mar 2015 15:44:18 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 147 30 2 6 2 2 +ENDOFSECTION + NODAL COORDINATES 2.3.16 + 1 -1.00000000000e-02 -8.00000000000e-03 + 2 1.00000000000e-02 -8.00000000000e-03 + 3 1.00000000000e-02 8.00000000000e-03 + 4 -1.00000000000e-02 8.00000000000e-03 + 5 5.00000000000e-03 -1.30000000000e-02 + 6 -5.00000000000e-03 -1.30000000000e-02 + 7 -1.66666666667e-03 -1.30000000000e-02 + 8 1.66666666667e-03 -1.30000000000e-02 + 9 -3.33333333333e-03 -1.30000000000e-02 + 10 -8.67361737988e-19 -1.30000000000e-02 + 11 3.33333333333e-03 -1.30000000000e-02 + 12 -5.00000000000e-03 -8.05000000000e-03 + 13 -5.00000000000e-03 -1.05250000000e-02 + 14 -5.00000000000e-03 -9.28750000000e-03 + 15 -5.00000000000e-03 -1.17625000000e-02 + 16 5.00000000000e-03 -8.05000000000e-03 + 17 5.00000000000e-03 -1.05250000000e-02 + 18 5.00000000000e-03 -1.17625000000e-02 + 19 5.00000000000e-03 -9.28750000000e-03 + 20 -1.66666666667e-03 -8.05000000000e-03 + 21 1.66666666667e-03 -8.05000000000e-03 + 22 -3.33333333333e-03 -8.05000000000e-03 + 23 -8.67361737988e-19 -8.05000000000e-03 + 24 3.33333333333e-03 -8.05000000000e-03 + 25 1.66666666667e-03 -1.05250000000e-02 + 26 -1.66666666667e-03 -1.05250000000e-02 + 27 1.66666666667e-03 -9.28750000000e-03 + 28 3.33333333333e-03 -1.05250000000e-02 + 29 3.33333333333e-03 -9.28750000000e-03 + 30 -1.66666666667e-03 -9.28750000000e-03 + 31 -5.42101086243e-19 -1.05250000000e-02 + 32 -7.04731412116e-19 -9.28750000000e-03 + 33 -3.33333333333e-03 -1.05250000000e-02 + 34 -3.33333333333e-03 -9.28750000000e-03 + 35 1.66666666667e-03 -1.17625000000e-02 + 36 3.33333333333e-03 -1.17625000000e-02 + 37 -1.66666666667e-03 -1.17625000000e-02 + 38 -7.04731412116e-19 -1.17625000000e-02 + 39 -3.33333333333e-03 -1.17625000000e-02 + 40 -5.05000000000e-03 -8.00000000000e-03 + 41 -5.02500000000e-03 -8.02500000000e-03 + 42 5.05000000000e-03 -8.00000000000e-03 + 43 5.02500000000e-03 -8.02500000000e-03 + 44 1.68333333333e-03 -8.00000000000e-03 + 45 -1.68333333333e-03 -8.00000000000e-03 + 46 3.36666666667e-03 -8.00000000000e-03 + 47 8.67361737988e-19 -8.00000000000e-03 + 48 -3.36666666667e-03 -8.00000000000e-03 + 49 -1.67500000000e-03 -8.02500000000e-03 + 50 -3.35000000000e-03 -8.02500000000e-03 + 51 1.67500000000e-03 -8.02500000000e-03 + 52 0.00000000000e+00 -8.02500000000e-03 + 53 3.35000000000e-03 -8.02500000000e-03 + 54 1.00000000000e-02 -2.66666666667e-03 + 55 1.00000000000e-02 2.66666666667e-03 + 56 1.00000000000e-02 -5.33333333333e-03 + 57 1.00000000000e-02 0.00000000000e+00 + 58 1.00000000000e-02 5.33333333333e-03 + 59 -1.00000000000e-02 2.66666666667e-03 + 60 -1.00000000000e-02 -2.66666666667e-03 + 61 -1.00000000000e-02 5.33333333333e-03 + 62 -1.00000000000e-02 0.00000000000e+00 + 63 -1.00000000000e-02 -5.33333333333e-03 + 64 7.11250000000e-03 -8.00000000000e-03 + 65 6.08125000000e-03 -8.00000000000e-03 + 66 8.55625000000e-03 -8.00000000000e-03 + 67 -7.11250000000e-03 -8.00000000000e-03 + 68 -6.08125000000e-03 -8.00000000000e-03 + 69 -8.55625000000e-03 -8.00000000000e-03 + 70 -5.05000000000e-03 8.00000000000e-03 + 71 -7.11250000000e-03 8.00000000000e-03 + 72 -8.55625000000e-03 8.00000000000e-03 + 73 -6.08125000000e-03 8.00000000000e-03 + 74 5.05000000000e-03 8.00000000000e-03 + 75 7.11250000000e-03 8.00000000000e-03 + 76 6.08125000000e-03 8.00000000000e-03 + 77 8.55625000000e-03 8.00000000000e-03 + 78 5.05000000000e-03 -2.66666666667e-03 + 79 5.05000000000e-03 2.66666666667e-03 + 80 5.05000000000e-03 -5.33333333333e-03 + 81 5.05000000000e-03 0.00000000000e+00 + 82 5.05000000000e-03 5.33333333333e-03 + 83 7.11250000000e-03 2.66666666667e-03 + 84 7.11250000000e-03 -2.66666666667e-03 + 85 8.55625000000e-03 2.66666666667e-03 + 86 7.11250000000e-03 5.33333333333e-03 + 87 8.55625000000e-03 5.33333333333e-03 + 88 8.55625000000e-03 -2.66666666667e-03 + 89 7.11250000000e-03 2.16840434497e-19 + 90 8.55625000000e-03 1.08420217249e-19 + 91 7.11250000000e-03 -5.33333333333e-03 + 92 8.55625000000e-03 -5.33333333333e-03 + 93 6.08125000000e-03 2.66666666667e-03 + 94 6.08125000000e-03 5.33333333333e-03 + 95 6.08125000000e-03 -2.66666666667e-03 + 96 6.08125000000e-03 1.08420217249e-19 + 97 6.08125000000e-03 -5.33333333333e-03 + 98 -5.05000000000e-03 2.66666666667e-03 + 99 -5.05000000000e-03 -2.66666666667e-03 + 100 -5.05000000000e-03 5.33333333333e-03 + 101 -5.05000000000e-03 0.00000000000e+00 + 102 -5.05000000000e-03 -5.33333333333e-03 + 103 -7.11250000000e-03 -2.66666666667e-03 + 104 -7.11250000000e-03 2.66666666667e-03 + 105 -8.55625000000e-03 -2.66666666667e-03 + 106 -7.11250000000e-03 -5.33333333333e-03 + 107 -8.55625000000e-03 -5.33333333333e-03 + 108 -8.55625000000e-03 2.66666666667e-03 + 109 -7.11250000000e-03 -2.16840434497e-19 + 110 -8.55625000000e-03 -1.08420217249e-19 + 111 -7.11250000000e-03 5.33333333333e-03 + 112 -8.55625000000e-03 5.33333333333e-03 + 113 -6.08125000000e-03 -2.66666666667e-03 + 114 -6.08125000000e-03 -5.33333333333e-03 + 115 -6.08125000000e-03 2.66666666667e-03 + 116 -6.08125000000e-03 -1.08420217249e-19 + 117 -6.08125000000e-03 5.33333333333e-03 + 118 -1.68333333333e-03 8.00000000000e-03 + 119 1.68333333333e-03 8.00000000000e-03 + 120 -3.36666666667e-03 8.00000000000e-03 + 121 -8.67361737988e-19 8.00000000000e-03 + 122 3.36666666667e-03 8.00000000000e-03 + 123 1.68333333333e-03 2.66666666667e-03 + 124 1.68333333333e-03 -2.66666666667e-03 + 125 -1.68333333333e-03 2.66666666667e-03 + 126 -1.68333333333e-03 -2.66666666667e-03 + 127 1.68333333333e-03 5.33333333333e-03 + 128 3.36666666667e-03 2.66666666667e-03 + 129 3.36666666667e-03 5.33333333333e-03 + 130 -1.68333333333e-03 5.33333333333e-03 + 131 -7.58941520740e-19 2.66666666667e-03 + 132 -8.13151629364e-19 5.33333333333e-03 + 133 -3.36666666667e-03 2.66666666667e-03 + 134 -3.36666666667e-03 5.33333333333e-03 + 135 1.68333333333e-03 2.16840434497e-19 + 136 3.36666666667e-03 -2.66666666667e-03 + 137 3.36666666667e-03 1.08420217249e-19 + 138 -1.68333333333e-03 6.50521303491e-19 + 139 4.33680868994e-19 -2.66666666667e-03 + 140 -2.71050543121e-19 5.42101086243e-19 + 141 -3.36666666667e-03 -2.66666666667e-03 + 142 -3.36666666667e-03 2.16840434497e-19 + 143 1.68333333333e-03 -5.33333333333e-03 + 144 3.36666666667e-03 -5.33333333333e-03 + 145 -1.68333333333e-03 -5.33333333333e-03 + 146 6.50521303491e-19 -5.33333333333e-03 + 147 -3.36666666667e-03 -5.33333333333e-03 +ENDOFSECTION + ELEMENTS/CELLS 2.3.16 + 1 2 9 16 24 21 27 25 28 17 + 19 29 + 2 2 9 21 23 20 30 26 31 25 + 27 32 + 3 2 9 20 22 12 14 13 33 26 + 30 34 + 4 2 9 17 28 25 35 8 11 5 + 18 36 + 5 2 9 25 31 26 37 7 10 8 + 35 38 + 6 2 9 26 33 13 15 6 9 7 + 37 39 + 7 2 9 40 41 12 22 20 49 45 + 48 50 + 8 2 9 45 49 20 23 21 51 44 + 47 52 + 9 2 9 44 51 21 24 16 43 42 + 46 53 + 10 2 9 75 86 83 85 55 58 3 + 77 87 + 11 2 9 83 89 84 88 54 57 55 + 85 90 + 12 2 9 84 91 64 66 2 56 54 + 88 92 + 13 2 9 74 82 79 93 83 86 75 + 76 94 + 14 2 9 79 81 78 95 84 89 83 + 93 96 + 15 2 9 78 80 42 65 64 91 84 + 95 97 + 16 2 9 67 106 103 105 60 63 1 + 69 107 + 17 2 9 103 109 104 108 59 62 60 + 105 110 + 18 2 9 104 111 71 72 4 61 59 + 108 112 + 19 2 9 40 102 99 113 103 106 67 + 68 114 + 20 2 9 99 101 98 115 104 109 103 + 113 116 + 21 2 9 98 100 70 73 71 111 104 + 115 117 + 22 2 9 74 122 119 127 123 128 79 + 82 129 + 23 2 9 119 121 118 130 125 131 123 + 127 132 + 24 2 9 118 120 70 100 98 133 125 + 130 134 + 25 2 9 79 128 123 135 124 136 78 + 81 137 + 26 2 9 123 131 125 138 126 139 124 + 135 140 + 27 2 9 125 133 98 101 99 141 126 + 138 142 + 28 2 9 78 136 124 143 44 46 42 + 80 144 + 29 2 9 124 139 126 145 45 47 44 + 143 146 + 30 2 9 126 141 99 102 40 48 45 + 145 147 +ENDOFSECTION + ELEMENT GROUP 2.3.16 +GROUP: 1 ELEMENTS: 27 MATERIAL: 2 NFLAGS: 1 + 10 + 0 + 10 11 12 13 14 15 22 23 24 25 + 26 27 28 29 30 16 17 18 19 20 + 21 1 2 3 4 5 6 +ENDOFSECTION + ELEMENT GROUP 2.3.16 +GROUP: 2 ELEMENTS: 3 MATERIAL: 4 NFLAGS: 1 + 11 + 0 + 7 8 9 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 1 1 7 0 6 + 13 2 4 + 10 2 4 + 24 2 1 + 23 2 1 + 22 2 1 + 18 2 2 + 21 2 2 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 2 1 6 0 6 + 12 2 3 + 11 2 3 + 10 2 3 + 18 2 3 + 17 2 3 + 16 2 3 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 3 1 4 0 6 + 15 2 2 + 12 2 2 + 19 2 4 + 16 2 4 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 4 1 2 0 6 + 7 2 1 + 9 2 3 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 5 1 4 0 6 + 4 2 4 + 1 2 4 + 3 2 2 + 6 2 2 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 6 1 3 0 6 + 6 2 3 + 5 2 3 + 4 2 3 +ENDOFSECTION diff --git a/applications/FSI/FSITimeDependentBenchmarks/input/gambit/drum2.dbs b/applications/FSI/FSITimeDependentBenchmarks/input/gambit/drum2.dbs new file mode 100644 index 0000000000000000000000000000000000000000..9df94a7a5dddee1c6a176e146ed7c1ead3f13249 GIT binary patch literal 176128 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�p7ie~|pkq+db* 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 F{|0&=l7RpK literal 0 HcmV?d00001 diff --git a/applications/FSI/FSITimeDependentBenchmarks/input/gambit/piston.neu b/applications/FSI/FSITimeDependentBenchmarks/input/gambit/piston.neu new file mode 100644 index 000000000..5054cc757 --- /dev/null +++ b/applications/FSI/FSITimeDependentBenchmarks/input/gambit/piston.neu @@ -0,0 +1,307 @@ + CONTROL INFO 2.3.16 +** GAMBIT NEUTRAL FILE +piston +PROGRAM: Gambit VERSION: 2.3.16 + 1 Apr 2015 14:43:26 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 189 10 2 4 3 3 +ENDOFSECTION + NODAL COORDINATES 2.3.16 + 1 1.00000000000e+01 0.00000000000e+00 0.00000000000e+00 + 2 1.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 3 9.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 4 8.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 5 7.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 6 6.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 7 5.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 8 4.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 9 3.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 10 2.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 11 9.50000000000e+00 0.00000000000e+00 0.00000000000e+00 + 12 8.50000000000e+00 0.00000000000e+00 0.00000000000e+00 + 13 7.50000000000e+00 0.00000000000e+00 0.00000000000e+00 + 14 6.50000000000e+00 0.00000000000e+00 0.00000000000e+00 + 15 5.50000000000e+00 0.00000000000e+00 0.00000000000e+00 + 16 4.50000000000e+00 0.00000000000e+00 0.00000000000e+00 + 17 3.50000000000e+00 0.00000000000e+00 0.00000000000e+00 + 18 2.50000000000e+00 0.00000000000e+00 0.00000000000e+00 + 19 1.50000000000e+00 0.00000000000e+00 0.00000000000e+00 + 20 0.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 21 0.00000000000e+00 1.00000000000e+00 0.00000000000e+00 + 22 0.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 23 1.00000000000e+01 1.00000000000e+00 0.00000000000e+00 + 24 1.00000000000e+01 5.00000000000e-01 0.00000000000e+00 + 25 1.00000000000e+00 1.00000000000e+00 0.00000000000e+00 + 26 5.00000000000e-01 1.00000000000e+00 0.00000000000e+00 + 27 0.00000000000e+00 0.00000000000e+00 1.00000000000e+00 + 28 0.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 29 1.00000000000e+01 0.00000000000e+00 1.00000000000e+00 + 30 1.00000000000e+01 0.00000000000e+00 5.00000000000e-01 + 31 0.00000000000e+00 1.00000000000e+00 1.00000000000e+00 + 32 0.00000000000e+00 1.00000000000e+00 5.00000000000e-01 + 33 1.00000000000e+00 0.00000000000e+00 1.00000000000e+00 + 34 5.00000000000e-01 0.00000000000e+00 1.00000000000e+00 + 35 0.00000000000e+00 5.00000000000e-01 1.00000000000e+00 + 36 1.00000000000e+01 1.00000000000e+00 1.00000000000e+00 + 37 1.00000000000e+01 5.00000000000e-01 1.00000000000e+00 + 38 1.00000000000e+00 1.00000000000e+00 1.00000000000e+00 + 39 9.00000000000e+00 1.00000000000e+00 1.00000000000e+00 + 40 8.00000000000e+00 1.00000000000e+00 1.00000000000e+00 + 41 7.00000000000e+00 1.00000000000e+00 1.00000000000e+00 + 42 6.00000000000e+00 1.00000000000e+00 1.00000000000e+00 + 43 5.00000000000e+00 1.00000000000e+00 1.00000000000e+00 + 44 4.00000000000e+00 1.00000000000e+00 1.00000000000e+00 + 45 3.00000000000e+00 1.00000000000e+00 1.00000000000e+00 + 46 2.00000000000e+00 1.00000000000e+00 1.00000000000e+00 + 47 9.50000000000e+00 1.00000000000e+00 1.00000000000e+00 + 48 8.50000000000e+00 1.00000000000e+00 1.00000000000e+00 + 49 7.50000000000e+00 1.00000000000e+00 1.00000000000e+00 + 50 6.50000000000e+00 1.00000000000e+00 1.00000000000e+00 + 51 5.50000000000e+00 1.00000000000e+00 1.00000000000e+00 + 52 4.50000000000e+00 1.00000000000e+00 1.00000000000e+00 + 53 3.50000000000e+00 1.00000000000e+00 1.00000000000e+00 + 54 2.50000000000e+00 1.00000000000e+00 1.00000000000e+00 + 55 1.50000000000e+00 1.00000000000e+00 1.00000000000e+00 + 56 5.00000000000e-01 0.00000000000e+00 0.00000000000e+00 + 57 1.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 58 2.00000000000e+00 1.00000000000e+00 0.00000000000e+00 + 59 3.00000000000e+00 1.00000000000e+00 0.00000000000e+00 + 60 4.00000000000e+00 1.00000000000e+00 0.00000000000e+00 + 61 5.00000000000e+00 1.00000000000e+00 0.00000000000e+00 + 62 6.00000000000e+00 1.00000000000e+00 0.00000000000e+00 + 63 7.00000000000e+00 1.00000000000e+00 0.00000000000e+00 + 64 8.00000000000e+00 1.00000000000e+00 0.00000000000e+00 + 65 9.00000000000e+00 1.00000000000e+00 0.00000000000e+00 + 66 1.50000000000e+00 1.00000000000e+00 0.00000000000e+00 + 67 2.50000000000e+00 1.00000000000e+00 0.00000000000e+00 + 68 3.50000000000e+00 1.00000000000e+00 0.00000000000e+00 + 69 4.50000000000e+00 1.00000000000e+00 0.00000000000e+00 + 70 5.50000000000e+00 1.00000000000e+00 0.00000000000e+00 + 71 6.50000000000e+00 1.00000000000e+00 0.00000000000e+00 + 72 7.50000000000e+00 1.00000000000e+00 0.00000000000e+00 + 73 8.50000000000e+00 1.00000000000e+00 0.00000000000e+00 + 74 9.50000000000e+00 1.00000000000e+00 0.00000000000e+00 + 75 1.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 76 1.00000000000e+00 1.00000000000e+00 5.00000000000e-01 + 77 2.00000000000e+00 0.00000000000e+00 1.00000000000e+00 + 78 3.00000000000e+00 0.00000000000e+00 1.00000000000e+00 + 79 4.00000000000e+00 0.00000000000e+00 1.00000000000e+00 + 80 5.00000000000e+00 0.00000000000e+00 1.00000000000e+00 + 81 6.00000000000e+00 0.00000000000e+00 1.00000000000e+00 + 82 7.00000000000e+00 0.00000000000e+00 1.00000000000e+00 + 83 8.00000000000e+00 0.00000000000e+00 1.00000000000e+00 + 84 9.00000000000e+00 0.00000000000e+00 1.00000000000e+00 + 85 1.50000000000e+00 0.00000000000e+00 1.00000000000e+00 + 86 2.50000000000e+00 0.00000000000e+00 1.00000000000e+00 + 87 3.50000000000e+00 0.00000000000e+00 1.00000000000e+00 + 88 4.50000000000e+00 0.00000000000e+00 1.00000000000e+00 + 89 5.50000000000e+00 0.00000000000e+00 1.00000000000e+00 + 90 6.50000000000e+00 0.00000000000e+00 1.00000000000e+00 + 91 7.50000000000e+00 0.00000000000e+00 1.00000000000e+00 + 92 8.50000000000e+00 0.00000000000e+00 1.00000000000e+00 + 93 9.50000000000e+00 0.00000000000e+00 1.00000000000e+00 + 94 1.00000000000e+00 5.00000000000e-01 1.00000000000e+00 + 95 5.00000000000e-01 1.00000000000e+00 1.00000000000e+00 + 96 1.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 97 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 98 5.00000000000e-01 1.00000000000e+00 5.00000000000e-01 + 99 5.00000000000e-01 5.00000000000e-01 1.00000000000e+00 + 100 5.00000000000e-01 0.00000000000e+00 5.00000000000e-01 + 101 0.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 102 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 103 2.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 104 1.50000000000e+00 5.00000000000e-01 0.00000000000e+00 + 105 3.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 106 2.50000000000e+00 5.00000000000e-01 0.00000000000e+00 + 107 4.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 108 3.50000000000e+00 5.00000000000e-01 0.00000000000e+00 + 109 5.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 110 4.50000000000e+00 5.00000000000e-01 0.00000000000e+00 + 111 6.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 112 5.50000000000e+00 5.00000000000e-01 0.00000000000e+00 + 113 7.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 114 6.50000000000e+00 5.00000000000e-01 0.00000000000e+00 + 115 8.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 116 7.50000000000e+00 5.00000000000e-01 0.00000000000e+00 + 117 9.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 118 8.50000000000e+00 5.00000000000e-01 0.00000000000e+00 + 119 9.50000000000e+00 5.00000000000e-01 0.00000000000e+00 + 120 2.00000000000e+00 5.00000000000e-01 1.00000000000e+00 + 121 1.50000000000e+00 5.00000000000e-01 1.00000000000e+00 + 122 3.00000000000e+00 5.00000000000e-01 1.00000000000e+00 + 123 2.50000000000e+00 5.00000000000e-01 1.00000000000e+00 + 124 4.00000000000e+00 5.00000000000e-01 1.00000000000e+00 + 125 3.50000000000e+00 5.00000000000e-01 1.00000000000e+00 + 126 5.00000000000e+00 5.00000000000e-01 1.00000000000e+00 + 127 4.50000000000e+00 5.00000000000e-01 1.00000000000e+00 + 128 6.00000000000e+00 5.00000000000e-01 1.00000000000e+00 + 129 5.50000000000e+00 5.00000000000e-01 1.00000000000e+00 + 130 7.00000000000e+00 5.00000000000e-01 1.00000000000e+00 + 131 6.50000000000e+00 5.00000000000e-01 1.00000000000e+00 + 132 8.00000000000e+00 5.00000000000e-01 1.00000000000e+00 + 133 7.50000000000e+00 5.00000000000e-01 1.00000000000e+00 + 134 9.00000000000e+00 5.00000000000e-01 1.00000000000e+00 + 135 8.50000000000e+00 5.00000000000e-01 1.00000000000e+00 + 136 9.50000000000e+00 5.00000000000e-01 1.00000000000e+00 + 137 2.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 138 1.50000000000e+00 0.00000000000e+00 5.00000000000e-01 + 139 3.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 140 2.50000000000e+00 0.00000000000e+00 5.00000000000e-01 + 141 4.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 142 3.50000000000e+00 0.00000000000e+00 5.00000000000e-01 + 143 5.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 144 4.50000000000e+00 0.00000000000e+00 5.00000000000e-01 + 145 6.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 146 5.50000000000e+00 0.00000000000e+00 5.00000000000e-01 + 147 7.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 148 6.50000000000e+00 0.00000000000e+00 5.00000000000e-01 + 149 8.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 150 7.50000000000e+00 0.00000000000e+00 5.00000000000e-01 + 151 9.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 152 8.50000000000e+00 0.00000000000e+00 5.00000000000e-01 + 153 9.50000000000e+00 0.00000000000e+00 5.00000000000e-01 + 154 1.00000000000e+01 1.00000000000e+00 5.00000000000e-01 + 155 2.00000000000e+00 1.00000000000e+00 5.00000000000e-01 + 156 1.50000000000e+00 1.00000000000e+00 5.00000000000e-01 + 157 3.00000000000e+00 1.00000000000e+00 5.00000000000e-01 + 158 2.50000000000e+00 1.00000000000e+00 5.00000000000e-01 + 159 4.00000000000e+00 1.00000000000e+00 5.00000000000e-01 + 160 3.50000000000e+00 1.00000000000e+00 5.00000000000e-01 + 161 5.00000000000e+00 1.00000000000e+00 5.00000000000e-01 + 162 4.50000000000e+00 1.00000000000e+00 5.00000000000e-01 + 163 6.00000000000e+00 1.00000000000e+00 5.00000000000e-01 + 164 5.50000000000e+00 1.00000000000e+00 5.00000000000e-01 + 165 7.00000000000e+00 1.00000000000e+00 5.00000000000e-01 + 166 6.50000000000e+00 1.00000000000e+00 5.00000000000e-01 + 167 8.00000000000e+00 1.00000000000e+00 5.00000000000e-01 + 168 7.50000000000e+00 1.00000000000e+00 5.00000000000e-01 + 169 9.00000000000e+00 1.00000000000e+00 5.00000000000e-01 + 170 8.50000000000e+00 1.00000000000e+00 5.00000000000e-01 + 171 9.50000000000e+00 1.00000000000e+00 5.00000000000e-01 + 172 1.00000000000e+01 5.00000000000e-01 5.00000000000e-01 + 173 2.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 174 1.50000000000e+00 5.00000000000e-01 5.00000000000e-01 + 175 3.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 176 2.50000000000e+00 5.00000000000e-01 5.00000000000e-01 + 177 4.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 178 3.50000000000e+00 5.00000000000e-01 5.00000000000e-01 + 179 5.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 180 4.50000000000e+00 5.00000000000e-01 5.00000000000e-01 + 181 6.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 182 5.50000000000e+00 5.00000000000e-01 5.00000000000e-01 + 183 7.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 184 6.50000000000e+00 5.00000000000e-01 5.00000000000e-01 + 185 8.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 186 7.50000000000e+00 5.00000000000e-01 5.00000000000e-01 + 187 9.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 188 8.50000000000e+00 5.00000000000e-01 5.00000000000e-01 + 189 9.50000000000e+00 5.00000000000e-01 5.00000000000e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.3.16 + 1 4 27 2 56 20 75 100 28 33 + 34 27 57 97 22 96 102 + 101 94 99 35 25 26 21 + 76 98 32 38 95 31 + 2 4 27 2 75 33 19 138 85 10 + 137 77 57 96 94 104 174 + 121 103 173 120 25 76 38 + 66 156 55 58 155 46 + 3 4 27 10 137 77 18 140 86 9 + 139 78 103 173 120 106 176 + 123 105 175 122 58 155 46 + 67 158 54 59 157 45 + 4 4 27 9 139 78 17 142 87 8 + 141 79 105 175 122 108 178 + 125 107 177 124 59 157 45 + 68 160 53 60 159 44 + 5 4 27 8 141 79 16 144 88 7 + 143 80 107 177 124 110 180 + 127 109 179 126 60 159 44 + 69 162 52 61 161 43 + 6 4 27 7 143 80 15 146 89 6 + 145 81 109 179 126 112 182 + 129 111 181 128 61 161 43 + 70 164 51 62 163 42 + 7 4 27 6 145 81 14 148 90 5 + 147 82 111 181 128 114 184 + 131 113 183 130 62 163 42 + 71 166 50 63 165 41 + 8 4 27 5 147 82 13 150 91 4 + 149 83 113 183 130 116 186 + 133 115 185 132 63 165 41 + 72 168 49 64 167 40 + 9 4 27 4 149 83 12 152 92 3 + 151 84 115 185 132 118 188 + 135 117 187 134 64 167 40 + 73 170 48 65 169 39 + 10 4 27 3 151 84 11 153 93 1 + 30 29 117 187 134 119 189 + 136 24 172 37 65 169 39 + 74 171 47 23 154 36 +ENDOFSECTION + ELEMENT GROUP 2.3.16 +GROUP: 1 ELEMENTS: 1 MATERIAL: 4 NFLAGS: 1 + 5 + 0 + 1 +ENDOFSECTION + ELEMENT GROUP 2.3.16 +GROUP: 2 ELEMENTS: 9 MATERIAL: 2 NFLAGS: 1 + 6 + 0 + 2 3 4 5 6 7 8 9 10 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 1 1 1 0 6 + 1 4 2 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 2 1 4 0 6 + 1 4 6 + 1 4 1 + 1 4 3 + 1 4 5 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 3 1 36 0 6 + 2 4 2 + 3 4 2 + 4 4 2 + 5 4 2 + 6 4 2 + 7 4 2 + 8 4 2 + 9 4 2 + 10 4 2 + 2 4 5 + 3 4 5 + 4 4 5 + 5 4 5 + 6 4 5 + 7 4 5 + 8 4 5 + 9 4 5 + 10 4 5 + 2 4 6 + 3 4 6 + 4 4 6 + 5 4 6 + 6 4 6 + 7 4 6 + 8 4 6 + 9 4 6 + 10 4 6 + 2 4 4 + 3 4 4 + 4 4 4 + 5 4 4 + 6 4 4 + 7 4 4 + 8 4 4 + 9 4 4 + 10 4 4 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 4 1 1 0 6 + 10 4 3 +ENDOFSECTION diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/CMakeLists.txt b/applications/NumPdeSpring2015/Eugenio/Ex3/CMakeLists.txt new file mode 100644 index 000000000..78ece9e49 --- /dev/null +++ b/applications/NumPdeSpring2015/Eugenio/Ex3/CMakeLists.txt @@ -0,0 +1,9 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8) + +SET (PROJECT_NAME "${MYNAME_FOLDER}${EXAMPLE_NUMBER}") +PROJECT(PROJECT_NAME) + +SET(MAIN_FILE "${EXAMPLE_NUMBER}") # the name of the source file with no extension +SET(EXEC_FILE "${MYNAME_FOLDER}${EXAMPLE_NUMBER}") # the name of the executable file + +femusMacroBuildApplication(${MAIN_FILE} ${EXEC_FILE}) diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/Ex3.cpp b/applications/NumPdeSpring2015/Eugenio/Ex3/Ex3.cpp new file mode 100644 index 000000000..789a1b5cf --- /dev/null +++ b/applications/NumPdeSpring2015/Eugenio/Ex3/Ex3.cpp @@ -0,0 +1,737 @@ +/** tutorial/Ex2 + * This example shows how to set and solve the weak form of the Poisson problem + * $$ \Delta u = 1 \text{ on }\Omega, $$ + * $$ u=0 \text{ on } \Gamma, $$ + * on a square domain $\Omega$ with boundary $\Gamma$; + * all the coarse-level meshes are removed; + * a multilevel problem and an equation system are initialized; + * a direct solver is used to solve the problem. + **/ + +#include "FemusInit.hpp" +#include "MultiLevelProblem.hpp" +#include "NumericVector.hpp" +#include "VTKWriter.hpp" +#include "GMVWriter.hpp" +#include "NonLinearImplicitSystem.hpp" +#include "adept.h" + + +using namespace femus; + +bool SetBoundaryCondition(const double &x, const double &y, const double &z,const char SolName[], double &value, const int facename, const double time) { + bool dirichlet = true; //dirichlet + value=0; + if(facename == 2) + dirichlet = false; + return dirichlet; +} + +void AssemblePoissonProblem(MultiLevelProblem &ml_prob, unsigned level, const unsigned &levelMax, const bool &assembleMatrix); + +void AssemblePoissonProblem_AD(MultiLevelProblem &ml_prob, unsigned level, const unsigned &levelMax, const bool &assembleMatrix); + +std::pair < double, double > GetErrorNorm(MultiLevelSolution *mlSol); + +int main(int argc, char **args) { + + // init Petsc-MPI communicator + FemusInit mpinit(argc, args, MPI_COMM_WORLD); + + + // define multilevel mesh + MultiLevelMesh mlMsh; + // read coarse level mesh and generate finers level meshes + double scalingFactor=1.; + mlMsh.ReadCoarseMesh("./input/square_quad.neu","seventh",scalingFactor); + /* "seventh" is the order of accuracy that is used in the gauss integration scheme + probably in the furure it is not going to be an argument of this function */ + unsigned dim = mlMsh.GetDimension(); + unsigned maxNumberOfMeshes; + + if(dim==2){ + maxNumberOfMeshes = 5; + } + else{ + maxNumberOfMeshes = 4; + } + + vector < vector < double > > l2Norm; + l2Norm.resize(maxNumberOfMeshes); + + vector < vector < double > > semiNorm; + semiNorm.resize(maxNumberOfMeshes); + + for(unsigned i = maxNumberOfMeshes-1; i < maxNumberOfMeshes; i++){ // loop on the mesh level + + unsigned numberOfUniformLevels = i+1; + unsigned numberOfSelectiveLevels = 0; + mlMsh.RefineMesh(numberOfUniformLevels , numberOfUniformLevels + numberOfSelectiveLevels, NULL); + + // erase all the coarse mesh levels + mlMsh.EraseCoarseLevels(numberOfUniformLevels-1); + + // print mesh info + mlMsh.PrintInfo(); + + FEOrder feOrder[3] = {FIRST, SERENDIPITY, SECOND}; + l2Norm[i].resize(3); + semiNorm[i].resize(3); + + for(unsigned j=2; j<3; j++){ // loop on the FE Order + // define the multilevel solution and attach the mlMsh object to it + MultiLevelSolution mlSol(&mlMsh); + + // add variables to mlSol + mlSol.AddSolution("u",LAGRANGE, feOrder[j]); + mlSol.Initialize("All"); + + // attach the boundary condition function and generate boundary data + mlSol.AttachSetBoundaryConditionFunction(SetBoundaryCondition); + mlSol.GenerateBdc("u"); + + // define the multilevel problem attach the mlSol object to it + MultiLevelProblem mlProb(&mlSol); + + // add system Poisson in mlProb as a Linear Implicit System + NonLinearImplicitSystem & system = mlProb.add_system < NonLinearImplicitSystem > ("Poisson"); + + // add solution "u" to system + system.AddSolutionToSystemPDE("u"); + + // attach the assembling function to system + system.SetAssembleFunction(AssemblePoissonProblem_AD); + + // initilaize and solve the system + system.init(); + system.solve(); + + std::pair< double , double > norm = GetErrorNorm(&mlSol); + l2Norm[i][j] =norm.first; + semiNorm[i][j]=norm.second; + // print solutions + std::vector < std::string > variablesToBePrinted; + variablesToBePrinted.push_back("All"); + + VTKWriter vtkIO(&mlSol); + vtkIO.write(DEFAULT_OUTPUTDIR, "biquadratic", variablesToBePrinted); + + GMVWriter gmvIO(&mlSol); + gmvIO.SetDebugOutput(true); + gmvIO.write(DEFAULT_OUTPUTDIR, "biquadratic", variablesToBePrinted); + } + } + + // print the seminorm of the error and the order of convergence between different levels + std::cout< &x){ + double pi=acos(-1.); + return cos(pi*x[0])*cos(pi*x[1]); +}; + + +void GetExactSolutionGradient(const vector < double > &x, vector < double > &solGrad){ + double pi=acos(-1.); + solGrad[0] = -pi*sin(pi*x[0])*cos(pi*x[1]); + solGrad[1] = -pi*cos(pi*x[0])*sin(pi*x[1]); +}; + + +double GetExactSolutionLaplace(const vector < double > &x){ + double pi=acos(-1.); + return -pi*pi*cos(pi*x[0])*cos(pi*x[1]) - pi*pi*cos(pi*x[0])*cos(pi*x[1]); +}; + +/** + * This function assemble the stiffnes matrix KK and the residual vector Res + * such that + * KK w = RES = F - KK u0, + * and consequently + * u = u0 + w satisfies KK u = F + **/ +void AssemblePoissonProblem(MultiLevelProblem &ml_prob, unsigned level, const unsigned &levelMax, const bool &assembleMatrix) { + // ml_prob is the global object from/to where get/set all the data + // level is the level of the PDE system to be assembled + // levelMax is the Maximum level of the MultiLevelProblem + // assembleMatrix is a flag that tells if only the residual or also the matrix should be assembled + + // extract pointers to the several objects that we are going to use + Mesh* msh = ml_prob._ml_msh->GetLevel(level); // pointer to the mesh (level) object + elem* el = msh->el; // pointer to the elem object in msh (level) + + MultiLevelSolution* mlSol = ml_prob._ml_sol; // pointer to the multilevel solution object + Solution* sol = ml_prob._ml_sol->GetSolutionLevel(level); // pointer to the solution (level) object + + NonLinearImplicitSystem* mlPdeSys = &ml_prob.get_system< NonLinearImplicitSystem >("Poisson"); // pointer to the linear implicit system named "Poisson" + LinearEquationSolver* pdeSys = mlPdeSys->_LinSolver[level]; // pointer to the equation (level) object + SparseMatrix* KK = pdeSys->_KK; // pointer to the global stifness matrix object in pdeSys (level) + NumericVector* RES = pdeSys->_RES; // pointer to the global residual vector object in pdeSys (level) + + const unsigned dim = msh->GetDimension(); // get the domain dimension of the problem + unsigned iproc = msh->processor_id(); // get the process_id (for parallel computation) + + //solution variable + unsigned soluIndex; + soluIndex = mlSol->GetIndex("u"); // get the position of "u" in the ml_sol object + unsigned soluType = mlSol->GetSolutionType(soluIndex); // get the finite element type for "u" + + unsigned soluPdeIndex; + soluPdeIndex = mlPdeSys->GetSolPdeIndex("u"); // get the position of "u" in the pdeSys object + + vector < double > solu; // local solution + + vector < vector < double > > x(dim); // local coordinates + unsigned xType = 2; // get the finite element type for "x", it is always 2 (LAGRANGE QUADRATIC) + + vector< int > KKDof; // local to global pdeSys dofs + vector phi; // local test function + vector phi_x; // local test function first order partial derivatives + vector phi_xx; // local test function second order partial derivatives + double weight; // gauss point weight + + vector< double > Res; // local redidual vector + vector< double > K; // local stiffness matrix + + // reserve memory for the local standar vectors + const unsigned maxSize = static_cast< unsigned > (ceil(pow(3,dim))); // conservative: based on line3, quad9, hex27 + solu.reserve(maxSize); + for(unsigned i = 0; i < dim; i++) + x[i].reserve(maxSize); + KKDof.reserve(maxSize); + phi.reserve(maxSize); + phi_x.reserve(maxSize*dim); + unsigned dim2=(3*(dim-1)+!(dim-1)); // dim2 is the number of second order partial derivatives (1,3,6 depending on the dimension) + phi_xx.reserve(maxSize*dim2); + Res.reserve(maxSize); + K.reserve(maxSize*maxSize); + + if( assembleMatrix ) + KK->zero(); // Set to zero all the entries of the Global Matrix + + // element loop: each process loops only on the elements that owns + for (int iel=msh->IS_Mts2Gmt_elem_offset[iproc]; iel < msh->IS_Mts2Gmt_elem_offset[iproc+1]; iel++) { + + unsigned kel = msh->IS_Mts2Gmt_elem[iel]; // mapping between paralell dof and mesh dof + short unsigned kelGeom = el->GetElementType( kel ); // element geometry type + unsigned nDofs = el->GetElementDofNumber( kel, soluType); // number of solution element dofs + unsigned nDofs2 = el->GetElementDofNumber( kel, xType); // number of coordinate element dofs + + // resize local arrays + KKDof.resize(nDofs); + solu.resize(nDofs); + for(int i=0; iGetMeshDof(kel, i, soluType); // local to global solution node + unsigned solDof = msh->GetMetisDof(iNode, soluType); // global to global mapping between solution node and solution dof + solu[i] = (*sol->_Sol[soluIndex])(solDof); // global extraction and local storage for the solution + KKDof[i] = pdeSys->GetKKDof(soluIndex, soluPdeIndex, iNode); // global to global mapping between solution node and pdeSys dof + } + + // local storage of coordinates + for( unsigned i=0; iGetMeshDof(kel, i, xType); // local to global coordinates node + unsigned xDof = msh->GetMetisDof(iNode, xType); // global to global mapping between coordinates node and coordinate dof + for(unsigned jdim=0; jdim_coordinate->_Sol[jdim])(xDof); // global extraction and local storage for the element coordinates + } + } + + if( level == levelMax || !el->GetRefinedElementIndex(kel)) { // do not care about this if now (it is used for the AMR) + // *** Gauss point loop *** + for(unsigned ig=0; ig < msh->_finiteElement[kelGeom][soluType]->GetGaussPointNumber(); ig++) { + // *** get gauss point weight, test function and test function partial derivatives *** + msh->_finiteElement[kelGeom][soluType]->Jacobian(x,ig,weight,phi,phi_x,phi_xx); + + // evaluate the solution, the solution derivatives and the coordinates in the gauss point + double soluGauss = 0; + vector < double > soluGauss_x(dim,0.); + vector < double > xGauss(dim,0.); + + for(unsigned i=0; i exactSolGrad(dim); + GetExactSolutionGradient(xGauss , exactSolGrad); + + double exactSolLaplace = GetExactSolutionLaplace(xGauss); + + + double srcTerm = rho * exactSolValue * ( exactSolGrad[0] + exactSolGrad[1] ) + - exactSolLaplace; + Res[i]+= ( srcTerm*phi[i] - laplace - nonLinearTerm ) * weight; + + if( assembleMatrix ) { + // *** phi_j loop *** + for(unsigned j=0; jadd_vector_blocked(Res,KKDof); + if(assembleMatrix) KK->add_matrix_blocked(K,KKDof,KKDof); + } //end element loop for each process + + RES->close(); + if( assembleMatrix ) KK->close(); + // ***************** END ASSEMBLY ******************* +} + + + +/** + * This function assemble the stiffnes matrix KK and the residual vector Res + * Using automatic divverentiation for Newton iterative scheme + * J(u0) w = - F(u0) , + * with u = u0 + w + * - F = f(x) - KK u = Res + * J = \grad_u F = KK + * + * thus + * KK w = f(x) - KK u0 + **/ + +void AssemblePoissonProblem_AD(MultiLevelProblem &ml_prob, unsigned level, const unsigned &levelMax, const bool &assembleMatrix) { + // ml_prob is the global object from/to where get/set all the data + // level is the level of the PDE system to be assembled + // levelMax is the Maximum level of the MultiLevelProblem + // assembleMatrix is a flag that tells if only the residual or also the matrix should be assembled + + // call the adept stack object + + + adept::Stack & s = FemusInit::_adeptStack; + + // extract pointers to the several objects that we are going to use + Mesh* msh = ml_prob._ml_msh->GetLevel(level); // pointer to the mesh (level) object + elem* el = msh->el; // pointer to the elem object in msh (level) + + MultiLevelSolution* mlSol = ml_prob._ml_sol; // pointer to the multilevel solution object + Solution* sol = ml_prob._ml_sol->GetSolutionLevel(level); // pointer to the solution (level) object + + NonLinearImplicitSystem* mlPdeSys = &ml_prob.get_system("Poisson"); // pointer to the linear implicit system named "Poisson" + LinearEquationSolver* pdeSys = mlPdeSys->_LinSolver[level]; // pointer to the equation (level) object + SparseMatrix* KK = pdeSys->_KK; // pointer to the global stifness matrix object in pdeSys (level) + NumericVector* RES = pdeSys->_RES; // pointer to the global residual vector object in pdeSys (level) + + const unsigned dim = msh->GetDimension(); // get the domain dimension of the problem + unsigned iproc = msh->processor_id(); // get the process_id (for parallel computation) + + //solution variable + unsigned soluIndex; + soluIndex = mlSol->GetIndex("u"); // get the position of "u" in the ml_sol object + unsigned soluType = mlSol->GetSolutionType(soluIndex); // get the finite element type for "u" + + unsigned soluPdeIndex; + soluPdeIndex = mlPdeSys->GetSolPdeIndex("u"); // get the position of "u" in the pdeSys object + + vector < adept::adouble > solu; // local solution + + vector < vector < double > > x(dim); // local coordinates + unsigned xType = 2; // get the finite element type for "x", it is always 2 (LAGRANGE QUADRATIC) + + vector< int > KKDof; // local to global pdeSys dofs + vector phi; // local test function + vector phi_x; // local test function first order partial derivatives + vector phi_xx; // local test function second order partial derivatives + double weight; // gauss point weight + + vector< double > Res; // local redidual vector + vector< adept::adouble > aRes; // local redidual vector + vector< double > K; // local stiffness matrix + + // reserve memory for the local standar vectors + const unsigned maxSize = static_cast< unsigned > (ceil(pow(3,dim))); // conservative: based on line3, quad9, hex27 + solu.reserve(maxSize); + for(unsigned i = 0; i < dim; i++) + x[i].reserve(maxSize); + KKDof.reserve(maxSize); + phi.reserve(maxSize); + phi_x.reserve(maxSize*dim); + unsigned dim2=(3*(dim-1)+!(dim-1)); // dim2 is the number of second order partial derivatives (1,3,6 depending on the dimension) + phi_xx.reserve(maxSize*dim2); + Res.reserve(maxSize); + aRes.reserve(maxSize); + K.reserve(maxSize*maxSize); + + vector < double > Jac; + Jac.reserve(maxSize*maxSize); + + if( assembleMatrix ) + KK->zero(); // Set to zero all the entries of the Global Matrix + + // element loop: each process loops only on the elements that owns + for (int iel=msh->IS_Mts2Gmt_elem_offset[iproc]; iel < msh->IS_Mts2Gmt_elem_offset[iproc+1]; iel++) { + + unsigned kel = msh->IS_Mts2Gmt_elem[iel]; // mapping between paralell dof and mesh dof + short unsigned kelGeom = el->GetElementType( kel ); // element geometry type + unsigned nDofs = el->GetElementDofNumber( kel, soluType); // number of solution element dofs + unsigned nDofs2 = el->GetElementDofNumber( kel, xType); // number of coordinate element dofs + + // resize local arrays + KKDof.resize(nDofs); + solu.resize(nDofs); + for(int i=0; iGetMeshDof(kel, i, soluType); // local to global solution node + unsigned solDof = msh->GetMetisDof(iNode, soluType); // global to global mapping between solution node and solution dof + solu[i] = (*sol->_Sol[soluIndex])(solDof); // global extraction and local storage for the solution + KKDof[i] = pdeSys->GetKKDof(soluIndex, soluPdeIndex, iNode); // global to global mapping between solution node and pdeSys dof + } + + // local storage of coordinates + for( unsigned i=0; iGetMeshDof(kel, i, xType); // local to global coordinates node + unsigned xDof = msh->GetMetisDof(iNode, xType); // global to global mapping between coordinates node and coordinate dof + for(unsigned jdim=0; jdim_coordinate->_Sol[jdim])(xDof); // global extraction and local storage for the element coordinates + } + } + + if( level == levelMax || !el->GetRefinedElementIndex(kel)) { // do not care about this if now (it is used for the AMR) + // start a new recording of all the operations involving adept::adouble variables + s.new_recording(); + + // *** Gauss point loop *** + for(unsigned ig=0; ig < msh->_finiteElement[kelGeom][soluType]->GetGaussPointNumber(); ig++) { + // *** get gauss point weight, test function and test function partial derivatives *** + msh->_finiteElement[kelGeom][soluType]->Jacobian(x,ig,weight,phi,phi_x,phi_xx); + + // evaluate the solution, the solution derivatives and the coordinates in the gauss point + adept::adouble soluGauss = 0; + vector < adept::adouble > soluGauss_x(dim,0.); + vector < double > xGauss(dim,0.); + + for(unsigned i=0; i exactSolGrad(dim); + GetExactSolutionGradient(xGauss , exactSolGrad); + + double exactSolLaplace = GetExactSolutionLaplace(xGauss); + + + double srcTerm = rho * exactSolValue * ( exactSolGrad[0] + exactSolGrad[1] ) + - exactSolLaplace; + aRes[i]+= ( srcTerm*phi[i] - laplace - nonLinearTerm ) * weight; + + + +// adept::adouble laplace = 0.; +// for(unsigned jdim=0; jdimadd_vector_blocked(Res,KKDof); + + if(assembleMatrix) { + + // define the dependent variables + s.dependent(&aRes[0], nDofs); + + // define the independent variables + s.independent(&solu[0], nDofs); + + // get the jacobian matrix (ordered by column) + s.jacobian(&Jac[0]); + + // get the jacobian matrix (ordered by raw, i.e. K=Jac^t) + for (int inode=0;inodeadd_matrix_blocked(K,KKDof,KKDof); + + s.clear_independents(); + s.clear_dependents(); + } + } //end element loop for each process + + RES->close(); + if( assembleMatrix ) KK->close(); + // ***************** END ASSEMBLY ******************* +} + + + + + + + + + + + + + + + + + + + + + +std::pair < double, double > GetErrorNorm(MultiLevelSolution *mlSol){ + unsigned level = mlSol->_ml_msh->GetNumberOfLevels()-1u; + // extract pointers to the several objects that we are going to use + Mesh* msh = mlSol->_ml_msh->GetLevel(level); // pointer to the mesh (level) object + elem* el = msh->el; // pointer to the elem object in msh (level) + Solution* sol = mlSol->GetSolutionLevel(level); // pointer to the solution (level) object + + const unsigned dim = msh->GetDimension(); // get the domain dimension of the problem + unsigned iproc = msh->processor_id(); // get the process_id (for parallel computation) + + //solution variable + unsigned soluIndex; + soluIndex = mlSol->GetIndex("u"); // get the position of "u" in the ml_sol object + unsigned soluType = mlSol->GetSolutionType(soluIndex); // get the finite element type for "u" + + vector < double > solu; // local solution + + vector < vector < double > > x(dim); // local coordinates + unsigned xType = 2; // get the finite element type for "x", it is always 2 (LAGRANGE QUADRATIC) + + vector phi; // local test function + vector phi_x; // local test function first order partial derivatives + vector phi_xx; // local test function second order partial derivatives + double weight; // gauss point weight + + // reserve memory for the local standar vectors + const unsigned maxSize = static_cast< unsigned > (ceil(pow(3,dim))); // conservative: based on line3, quad9, hex27 + solu.reserve(maxSize); + for(unsigned i = 0; i < dim; i++) + x[i].reserve(maxSize); + phi.reserve(maxSize); + phi_x.reserve(maxSize*dim); + unsigned dim2=(3*(dim-1)+!(dim-1)); // dim2 is the number of second order partial derivatives (1,3,6 depending on the dimension) + phi_xx.reserve(maxSize*dim2); + + double seminorm = 0.; + double l2norm = 0.; + + // element loop: each process loops only on the elements that owns + for (int iel=msh->IS_Mts2Gmt_elem_offset[iproc]; iel < msh->IS_Mts2Gmt_elem_offset[iproc+1]; iel++) { + + unsigned kel = msh->IS_Mts2Gmt_elem[iel]; // mapping between paralell dof and mesh dof + short unsigned kelGeom = el->GetElementType( kel ); // element geometry type + unsigned nDofs = el->GetElementDofNumber( kel, soluType); // number of solution element dofs + unsigned nDofs2 = el->GetElementDofNumber( kel, xType); // number of coordinate element dofs + + // resize local arrays + solu.resize(nDofs); + for(int i=0; iGetMeshDof(kel, i, soluType); // local to global solution node + unsigned solDof = msh->GetMetisDof(iNode, soluType); // global to global mapping between solution node and solution dof + solu[i] = (*sol->_Sol[soluIndex])(solDof); // global extraction and local storage for the solution + } + + // local storage of coordinates + for( unsigned i=0; iGetMeshDof(kel, i, xType); // local to global coordinates node + unsigned xDof = msh->GetMetisDof(iNode, xType); // global to global mapping between coordinates node and coordinate dof + for(unsigned jdim=0; jdim_coordinate->_Sol[jdim])(xDof); // global extraction and local storage for the element coordinates + } + } + + // *** Gauss point loop *** + for(unsigned ig=0; ig < msh->_finiteElement[kelGeom][soluType]->GetGaussPointNumber(); ig++) { + // *** get gauss point weight, test function and test function partial derivatives *** + msh->_finiteElement[kelGeom][soluType]->Jacobian(x,ig,weight,phi,phi_x,phi_xx); + + // evaluate the solution, the solution derivatives and the coordinates in the gauss point + double soluGauss = 0; + vector < double > soluGauss_x(dim,0.); + vector < double > xGauss(dim,0.); + + for(unsigned i=0; i solGrad(dim); + GetExactSolutionGradient(xGauss, solGrad); + + for (unsigned j=0;j init(msh->n_processors(), 1 , false, AUTOMATIC); + + norm_vec->set(iproc, l2norm); + norm_vec->close(); + l2norm=norm_vec->l1_norm(); + + norm_vec->set(iproc, seminorm); + norm_vec->close(); + seminorm=norm_vec->l1_norm(); + + delete norm_vec; + + std::pair < double, double > norm; + norm.first = sqrt(l2norm); + norm.second = sqrt(seminorm); + + return norm; + +} diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_hex.neu b/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_hex.neu new file mode 100644 index 000000000..7394da387 --- /dev/null +++ b/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_hex.neu @@ -0,0 +1,205 @@ + CONTROL INFO 2.3.16 +** GAMBIT NEUTRAL FILE +cube_hex +PROGRAM: Gambit VERSION: 2.3.16 +13 Mar 2015 15:51:34 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 125 8 1 2 3 3 +ENDOFSECTION + NODAL COORDINATES 2.3.16 + 1 5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 2 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 3 5.00000000000e-01 0.00000000000e+00 5.00000000000e-01 + 4 5.00000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 5 5.00000000000e-01 2.50000000000e-01 5.00000000000e-01 + 6 -5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 7 0.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 8 2.50000000000e-01 5.00000000000e-01 5.00000000000e-01 + 9 -2.50000000000e-01 5.00000000000e-01 5.00000000000e-01 + 10 -5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 11 -5.00000000000e-01 0.00000000000e+00 5.00000000000e-01 + 12 -5.00000000000e-01 2.50000000000e-01 5.00000000000e-01 + 13 -5.00000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 14 0.00000000000e+00 -5.00000000000e-01 5.00000000000e-01 + 15 -2.50000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 16 2.50000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 17 0.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 18 2.50000000000e-01 0.00000000000e+00 5.00000000000e-01 + 19 0.00000000000e+00 -2.50000000000e-01 5.00000000000e-01 + 20 2.50000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 21 0.00000000000e+00 2.50000000000e-01 5.00000000000e-01 + 22 2.50000000000e-01 2.50000000000e-01 5.00000000000e-01 + 23 -2.50000000000e-01 0.00000000000e+00 5.00000000000e-01 + 24 -2.50000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 25 -2.50000000000e-01 2.50000000000e-01 5.00000000000e-01 + 26 5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 27 5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 28 5.00000000000e-01 0.00000000000e+00 -5.00000000000e-01 + 29 5.00000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 30 5.00000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 31 -5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 32 0.00000000000e+00 -5.00000000000e-01 -5.00000000000e-01 + 33 2.50000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 34 -2.50000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 35 -5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 36 -5.00000000000e-01 0.00000000000e+00 -5.00000000000e-01 + 37 -5.00000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 38 -5.00000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 39 0.00000000000e+00 5.00000000000e-01 -5.00000000000e-01 + 40 -2.50000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 41 2.50000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 42 0.00000000000e+00 0.00000000000e+00 -5.00000000000e-01 + 43 2.50000000000e-01 0.00000000000e+00 -5.00000000000e-01 + 44 0.00000000000e+00 2.50000000000e-01 -5.00000000000e-01 + 45 2.50000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 46 0.00000000000e+00 -2.50000000000e-01 -5.00000000000e-01 + 47 2.50000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 48 -2.50000000000e-01 0.00000000000e+00 -5.00000000000e-01 + 49 -2.50000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 50 -2.50000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 51 -5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 52 -5.00000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 53 -5.00000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 54 5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 55 5.00000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 56 5.00000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 57 0.00000000000e+00 -5.00000000000e-01 0.00000000000e+00 + 58 0.00000000000e+00 -5.00000000000e-01 2.50000000000e-01 + 59 2.50000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 60 2.50000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 61 -2.50000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 62 -2.50000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 63 0.00000000000e+00 -5.00000000000e-01 -2.50000000000e-01 + 64 2.50000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 65 -2.50000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 66 -5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 67 -5.00000000000e-01 5.00000000000e-01 2.50000000000e-01 + 68 -5.00000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 69 -5.00000000000e-01 0.00000000000e+00 0.00000000000e+00 + 70 -5.00000000000e-01 0.00000000000e+00 2.50000000000e-01 + 71 -5.00000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 72 -5.00000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 73 -5.00000000000e-01 2.50000000000e-01 0.00000000000e+00 + 74 -5.00000000000e-01 2.50000000000e-01 2.50000000000e-01 + 75 -5.00000000000e-01 0.00000000000e+00 -2.50000000000e-01 + 76 -5.00000000000e-01 -2.50000000000e-01 -2.50000000000e-01 + 77 -5.00000000000e-01 2.50000000000e-01 -2.50000000000e-01 + 78 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 79 5.00000000000e-01 5.00000000000e-01 2.50000000000e-01 + 80 5.00000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 81 0.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 82 0.00000000000e+00 5.00000000000e-01 2.50000000000e-01 + 83 -2.50000000000e-01 5.00000000000e-01 0.00000000000e+00 + 84 -2.50000000000e-01 5.00000000000e-01 2.50000000000e-01 + 85 2.50000000000e-01 5.00000000000e-01 0.00000000000e+00 + 86 2.50000000000e-01 5.00000000000e-01 2.50000000000e-01 + 87 0.00000000000e+00 5.00000000000e-01 -2.50000000000e-01 + 88 -2.50000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 89 2.50000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 90 5.00000000000e-01 0.00000000000e+00 0.00000000000e+00 + 91 5.00000000000e-01 0.00000000000e+00 2.50000000000e-01 + 92 5.00000000000e-01 2.50000000000e-01 0.00000000000e+00 + 93 5.00000000000e-01 2.50000000000e-01 2.50000000000e-01 + 94 5.00000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 95 5.00000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 96 5.00000000000e-01 0.00000000000e+00 -2.50000000000e-01 + 97 5.00000000000e-01 2.50000000000e-01 -2.50000000000e-01 + 98 5.00000000000e-01 -2.50000000000e-01 -2.50000000000e-01 + 99 0.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 100 2.50000000000e-01 0.00000000000e+00 0.00000000000e+00 + 101 0.00000000000e+00 0.00000000000e+00 2.50000000000e-01 + 102 0.00000000000e+00 -2.50000000000e-01 0.00000000000e+00 + 103 2.50000000000e-01 0.00000000000e+00 2.50000000000e-01 + 104 2.50000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 105 0.00000000000e+00 -2.50000000000e-01 2.50000000000e-01 + 106 2.50000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 107 0.00000000000e+00 2.50000000000e-01 0.00000000000e+00 + 108 2.50000000000e-01 2.50000000000e-01 0.00000000000e+00 + 109 0.00000000000e+00 2.50000000000e-01 2.50000000000e-01 + 110 2.50000000000e-01 2.50000000000e-01 2.50000000000e-01 + 111 0.00000000000e+00 0.00000000000e+00 -2.50000000000e-01 + 112 2.50000000000e-01 0.00000000000e+00 -2.50000000000e-01 + 113 0.00000000000e+00 -2.50000000000e-01 -2.50000000000e-01 + 114 2.50000000000e-01 -2.50000000000e-01 -2.50000000000e-01 + 115 0.00000000000e+00 2.50000000000e-01 -2.50000000000e-01 + 116 2.50000000000e-01 2.50000000000e-01 -2.50000000000e-01 + 117 -2.50000000000e-01 0.00000000000e+00 0.00000000000e+00 + 118 -2.50000000000e-01 0.00000000000e+00 2.50000000000e-01 + 119 -2.50000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 120 -2.50000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 121 -2.50000000000e-01 2.50000000000e-01 0.00000000000e+00 + 122 -2.50000000000e-01 2.50000000000e-01 2.50000000000e-01 + 123 -2.50000000000e-01 0.00000000000e+00 -2.50000000000e-01 + 124 -2.50000000000e-01 -2.50000000000e-01 -2.50000000000e-01 + 125 -2.50000000000e-01 2.50000000000e-01 -2.50000000000e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.3.16 + 1 4 27 1 4 3 55 95 91 54 + 94 90 16 20 18 60 106 + 103 59 104 100 14 19 17 + 58 105 101 57 102 99 + 2 4 27 3 5 2 91 93 79 90 + 92 78 18 22 8 103 110 + 86 100 108 85 17 21 7 + 101 109 82 99 107 81 + 3 4 27 54 94 90 56 98 96 27 + 30 28 59 104 100 64 114 + 112 33 47 43 57 102 99 + 63 113 111 32 46 42 + 4 4 27 90 92 78 96 97 80 28 + 29 26 100 108 85 112 116 + 89 43 45 41 99 107 81 + 111 115 87 42 44 39 + 5 4 27 14 19 17 58 105 101 57 + 102 99 15 24 23 62 120 + 118 61 119 117 10 13 11 + 52 72 70 51 71 69 + 6 4 27 17 21 7 101 109 82 99 + 107 81 23 25 9 118 122 + 84 117 121 83 11 12 6 + 70 74 67 69 73 66 + 7 4 27 57 102 99 63 113 111 32 + 46 42 61 119 117 65 124 + 123 34 50 48 51 71 69 + 53 76 75 31 37 36 + 8 4 27 99 107 81 111 115 87 42 + 44 39 117 121 83 123 125 + 88 48 49 40 69 73 66 + 75 77 68 36 38 35 +ENDOFSECTION + ELEMENT GROUP 2.3.16 +GROUP: 1 ELEMENTS: 8 MATERIAL: 2 NFLAGS: 1 + 5 + 0 + 1 2 3 4 5 6 7 8 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 1 1 16 0 6 + 1 4 4 + 5 4 4 + 3 4 4 + 7 4 4 + 5 4 6 + 6 4 6 + 7 4 6 + 8 4 6 + 6 4 2 + 2 4 2 + 8 4 2 + 4 4 2 + 2 4 5 + 1 4 5 + 4 4 5 + 3 4 5 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 2 1 8 0 6 + 4 4 3 + 3 4 3 + 8 4 3 + 7 4 3 + 1 4 1 + 2 4 1 + 5 4 1 + 6 4 1 +ENDOFSECTION diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_mixed.neu b/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_mixed.neu new file mode 100644 index 000000000..6f60c433a --- /dev/null +++ b/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_mixed.neu @@ -0,0 +1,226 @@ + CONTROL INFO 2.3.16 +** GAMBIT NEUTRAL FILE +cube_mixed +PROGRAM: Gambit VERSION: 2.3.16 +14 Mar 2015 09:46:45 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 125 16 1 2 3 3 +ENDOFSECTION + NODAL COORDINATES 2.3.16 + 1 5.00000000000e-01 0.00000000000e+00 0.00000000000e+00 + 2 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 3 5.00000000000e-01 2.50000000000e-01 0.00000000000e+00 + 4 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 5 5.00000000000e-01 5.00000000000e-01 2.50000000000e-01 + 6 5.00000000000e-01 -3.06161699787e-17 5.00000000000e-01 + 7 5.00000000000e-01 2.50000000000e-01 5.00000000000e-01 + 8 5.00000000000e-01 -1.53080849893e-17 2.50000000000e-01 + 9 5.00000000000e-01 2.50000000000e-01 2.50000000000e-01 + 10 0.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 11 -3.06161699787e-17 -3.06161699787e-17 5.00000000000e-01 + 12 -1.53080849893e-17 -1.53080849893e-17 2.50000000000e-01 + 13 2.50000000000e-01 -3.06161699787e-17 5.00000000000e-01 + 14 2.50000000000e-01 0.00000000000e+00 0.00000000000e+00 + 15 2.50000000000e-01 -1.53080849893e-17 2.50000000000e-01 + 16 -3.06161699787e-17 5.00000000000e-01 5.00000000000e-01 + 17 -3.06161699787e-17 2.50000000000e-01 5.00000000000e-01 + 18 2.50000000000e-01 5.00000000000e-01 5.00000000000e-01 + 19 2.50000000000e-01 2.50000000000e-01 5.00000000000e-01 + 20 0.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 21 -1.53080849893e-17 5.00000000000e-01 2.50000000000e-01 + 22 2.50000000000e-01 5.00000000000e-01 0.00000000000e+00 + 23 2.50000000000e-01 5.00000000000e-01 2.50000000000e-01 + 24 0.00000000000e+00 2.50000000000e-01 0.00000000000e+00 + 25 2.50000000000e-01 2.50000000000e-01 0.00000000000e+00 + 26 -1.53080849893e-17 2.50000000000e-01 2.50000000000e-01 + 27 2.50000000000e-01 2.50000000000e-01 2.50000000000e-01 + 28 -5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 29 -2.50000000000e-01 5.00000000000e-01 0.00000000000e+00 + 30 -5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 31 -5.00000000000e-01 5.00000000000e-01 2.50000000000e-01 + 32 -2.50000000000e-01 5.00000000000e-01 5.00000000000e-01 + 33 -2.50000000000e-01 5.00000000000e-01 2.50000000000e-01 + 34 -5.00000000000e-01 -3.06161699787e-17 5.00000000000e-01 + 35 -5.00000000000e-01 2.50000000000e-01 5.00000000000e-01 + 36 -2.50000000000e-01 -3.06161699787e-17 5.00000000000e-01 + 37 -2.50000000000e-01 2.50000000000e-01 5.00000000000e-01 + 38 -5.00000000000e-01 0.00000000000e+00 0.00000000000e+00 + 39 -2.50000000000e-01 0.00000000000e+00 0.00000000000e+00 + 40 -5.00000000000e-01 -1.53080849893e-17 2.50000000000e-01 + 41 -2.50000000000e-01 -1.53080849893e-17 2.50000000000e-01 + 42 -5.00000000000e-01 2.50000000000e-01 0.00000000000e+00 + 43 -2.50000000000e-01 2.50000000000e-01 0.00000000000e+00 + 44 -5.00000000000e-01 2.50000000000e-01 2.50000000000e-01 + 45 -2.50000000000e-01 2.50000000000e-01 2.50000000000e-01 + 46 -3.06161699787e-17 -5.00000000000e-01 5.00000000000e-01 + 47 -3.06161699787e-17 -2.50000000000e-01 5.00000000000e-01 + 48 5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 49 2.50000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 50 5.00000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 51 2.50000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 52 0.00000000000e+00 -5.00000000000e-01 0.00000000000e+00 + 53 0.00000000000e+00 -2.50000000000e-01 0.00000000000e+00 + 54 5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 55 2.50000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 56 5.00000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 57 2.50000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 58 5.00000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 59 5.00000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 60 -1.53080849893e-17 -5.00000000000e-01 2.50000000000e-01 + 61 -1.53080849893e-17 -2.50000000000e-01 2.50000000000e-01 + 62 2.50000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 63 2.50000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 64 3.06161699787e-17 3.06161699787e-17 -5.00000000000e-01 + 65 1.53080849893e-17 1.53080849893e-17 -2.50000000000e-01 + 66 5.00000000000e-01 3.06161699787e-17 -5.00000000000e-01 + 67 2.50000000000e-01 3.06161699787e-17 -5.00000000000e-01 + 68 5.00000000000e-01 1.53080849893e-17 -2.50000000000e-01 + 69 2.50000000000e-01 1.53080849893e-17 -2.50000000000e-01 + 70 3.06161699787e-17 5.00000000000e-01 -5.00000000000e-01 + 71 1.53080849893e-17 5.00000000000e-01 -2.50000000000e-01 + 72 5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 73 5.00000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 74 2.50000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 75 2.50000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 76 5.00000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 77 5.00000000000e-01 2.50000000000e-01 -2.50000000000e-01 + 78 3.06161699787e-17 2.50000000000e-01 -5.00000000000e-01 + 79 1.53080849893e-17 2.50000000000e-01 -2.50000000000e-01 + 80 2.50000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 81 2.50000000000e-01 2.50000000000e-01 -2.50000000000e-01 + 82 3.06161699787e-17 -5.00000000000e-01 -5.00000000000e-01 + 83 3.06161699787e-17 -2.50000000000e-01 -5.00000000000e-01 + 84 1.53080849893e-17 -5.00000000000e-01 -2.50000000000e-01 + 85 1.53080849893e-17 -2.50000000000e-01 -2.50000000000e-01 + 86 5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 87 5.00000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 88 5.00000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 89 5.00000000000e-01 -2.50000000000e-01 -2.50000000000e-01 + 90 2.50000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 91 2.50000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 92 2.50000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 93 2.50000000000e-01 -2.50000000000e-01 -2.50000000000e-01 + 94 -5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 95 -2.50000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 96 -5.00000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 97 -2.50000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 98 -5.00000000000e-01 3.06161699787e-17 -5.00000000000e-01 + 99 -5.00000000000e-01 1.53080849893e-17 -2.50000000000e-01 + 100 -2.50000000000e-01 3.06161699787e-17 -5.00000000000e-01 + 101 -2.50000000000e-01 1.53080849893e-17 -2.50000000000e-01 + 102 -5.00000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 103 -2.50000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 104 -5.00000000000e-01 2.50000000000e-01 -2.50000000000e-01 + 105 -2.50000000000e-01 2.50000000000e-01 -2.50000000000e-01 + 106 -5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 107 -5.00000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 108 -2.50000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 109 -2.50000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 110 -5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 111 -5.00000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 112 -2.50000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 113 -2.50000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 114 -5.00000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 115 -2.50000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 116 -5.00000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 117 -2.50000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 118 -5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 119 -2.50000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 120 -5.00000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 121 -2.50000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 122 -5.00000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 123 -2.50000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 124 -5.00000000000e-01 -2.50000000000e-01 -2.50000000000e-01 + 125 -2.50000000000e-01 -2.50000000000e-01 -2.50000000000e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.3.16 + 1 6 10 20 21 16 27 19 6 23 + 18 7 4 + 2 6 10 20 27 6 26 13 11 24 + 15 12 10 + 3 6 10 20 21 16 26 17 11 27 + 19 13 6 + 4 6 10 20 25 1 27 8 6 24 + 14 15 10 + 5 6 10 20 25 1 22 3 2 23 + 9 5 4 + 6 6 10 20 25 1 23 9 4 27 + 8 7 6 + 7 5 18 16 21 20 17 26 11 32 + 33 29 37 45 36 30 31 + 28 35 44 34 + 8 5 18 11 26 20 12 24 10 36 + 45 29 41 43 39 34 44 + 28 40 42 38 + 9 5 18 10 14 1 15 8 6 53 + 57 56 63 59 50 52 55 + 54 62 58 48 + 10 5 18 10 15 6 12 13 11 53 + 63 50 61 51 47 52 62 + 48 60 49 46 + 11 5 18 20 22 2 25 3 1 71 + 75 73 81 77 68 70 74 + 72 80 76 66 + 12 5 18 20 25 1 24 14 10 71 + 81 68 79 69 65 70 80 + 66 78 67 64 + 13 4 27 10 53 52 65 85 84 64 + 83 82 14 57 55 69 93 + 91 67 92 90 1 56 54 + 68 89 87 66 88 86 + 14 4 27 64 78 70 100 103 95 98 + 102 94 65 79 71 101 105 + 97 99 104 96 10 24 20 + 39 43 29 38 42 28 + 15 4 27 10 39 38 53 113 111 52 + 112 110 12 41 40 61 117 + 116 60 115 114 11 36 34 + 47 109 107 46 108 106 + 16 4 27 10 53 52 39 113 112 38 + 111 110 65 85 84 101 125 + 123 99 124 122 64 83 82 + 100 121 119 98 120 118 +ENDOFSECTION + ELEMENT GROUP 2.3.16 +GROUP: 1 ELEMENTS: 16 MATERIAL: 2 NFLAGS: 1 + 5 + 0 + 11 12 13 9 10 1 2 3 4 5 + 6 15 7 8 14 16 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 1 1 20 0 6 + 16 4 2 + 16 4 3 + 15 4 3 + 15 4 2 + 14 4 2 + 14 4 3 + 7 5 1 + 7 5 5 + 8 5 5 + 5 6 4 + 1 6 2 + 6 6 3 + 5 6 3 + 11 5 2 + 11 5 1 + 13 4 6 + 13 4 2 + 9 5 5 + 10 5 5 + 9 5 2 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 2 1 10 0 6 + 14 4 5 + 16 4 6 + 13 4 3 + 11 5 5 + 12 5 5 + 1 6 3 + 3 6 3 + 7 5 3 + 15 4 6 + 10 5 2 +ENDOFSECTION diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_tet.neu b/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_tet.neu new file mode 100644 index 000000000..e986d9fae --- /dev/null +++ b/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_tet.neu @@ -0,0 +1,75 @@ + CONTROL INFO 2.3.16 +** GAMBIT NEUTRAL FILE +cube_tet +PROGRAM: Gambit VERSION: 2.3.16 +14 Mar 2015 13:49:37 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 27 6 1 2 3 3 +ENDOFSECTION + NODAL COORDINATES 2.3.16 + 1 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 2 -5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 3 0.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 4 -5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 5 -5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 6 -5.00000000000e-01 0.00000000000e+00 0.00000000000e+00 + 7 -5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 8 0.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 9 0.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 10 5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 11 0.00000000000e+00 -5.00000000000e-01 0.00000000000e+00 + 12 5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 13 0.00000000000e+00 0.00000000000e+00 -5.00000000000e-01 + 14 5.00000000000e-01 0.00000000000e+00 0.00000000000e+00 + 15 0.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 16 5.00000000000e-01 0.00000000000e+00 5.00000000000e-01 + 17 -5.00000000000e-01 0.00000000000e+00 5.00000000000e-01 + 18 0.00000000000e+00 -5.00000000000e-01 5.00000000000e-01 + 19 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 20 -5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 21 5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 22 5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 23 -5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 24 0.00000000000e+00 5.00000000000e-01 -5.00000000000e-01 + 25 5.00000000000e-01 0.00000000000e+00 -5.00000000000e-01 + 26 -5.00000000000e-01 0.00000000000e+00 -5.00000000000e-01 + 27 0.00000000000e+00 -5.00000000000e-01 -5.00000000000e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.3.16 + 1 6 10 1 9 4 16 11 10 3 + 23 18 2 + 2 6 10 1 9 4 3 23 2 15 + 6 17 5 + 3 6 10 1 9 4 15 6 5 8 + 26 20 7 + 4 6 10 1 19 12 9 13 4 8 + 24 26 7 + 5 6 10 10 11 4 16 9 1 14 + 13 19 12 + 6 6 10 10 22 21 11 27 4 14 + 25 13 12 +ENDOFSECTION + ELEMENT GROUP 2.3.16 +GROUP: 1 ELEMENTS: 6 MATERIAL: 2 NFLAGS: 1 + 5 + 0 + 6 5 4 3 2 1 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 1 1 8 0 6 + 6 6 1 + 2 6 3 + 1 6 3 + 3 6 4 + 3 6 3 + 4 6 2 + 6 6 2 + 5 6 4 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 2 1 4 0 6 + 4 6 3 + 6 6 3 + 2 6 4 + 1 6 4 +ENDOFSECTION diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_wedge.neu b/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_wedge.neu new file mode 100644 index 000000000..bf416ccd2 --- /dev/null +++ b/applications/NumPdeSpring2015/Eugenio/Ex3/input/cube_wedge.neu @@ -0,0 +1,230 @@ + CONTROL INFO 2.3.16 +** GAMBIT NEUTRAL FILE +cube_wedge +PROGRAM: Gambit VERSION: 2.3.16 +14 Mar 2015 12:58:03 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 125 16 1 2 3 3 +ENDOFSECTION + NODAL COORDINATES 2.3.16 + 1 5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 2 5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 3 5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 4 5.00000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 5 5.00000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 6 5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 7 5.00000000000e-01 0.00000000000e+00 -5.00000000000e-01 + 8 5.00000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 9 5.00000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 10 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 11 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 12 5.00000000000e-01 5.00000000000e-01 2.50000000000e-01 + 13 5.00000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 14 5.00000000000e-01 0.00000000000e+00 5.00000000000e-01 + 15 5.00000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 16 5.00000000000e-01 2.50000000000e-01 5.00000000000e-01 + 17 5.00000000000e-01 0.00000000000e+00 0.00000000000e+00 + 18 5.00000000000e-01 0.00000000000e+00 2.50000000000e-01 + 19 5.00000000000e-01 2.50000000000e-01 0.00000000000e+00 + 20 5.00000000000e-01 2.50000000000e-01 2.50000000000e-01 + 21 5.00000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 22 5.00000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 23 5.00000000000e-01 0.00000000000e+00 -2.50000000000e-01 + 24 5.00000000000e-01 2.50000000000e-01 -2.50000000000e-01 + 25 5.00000000000e-01 -2.50000000000e-01 -2.50000000000e-01 + 26 -5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 27 0.00000000000e+00 5.00000000000e-01 -5.00000000000e-01 + 28 -2.50000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 29 2.50000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 30 -5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 31 -5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 32 -5.00000000000e-01 5.00000000000e-01 2.50000000000e-01 + 33 -5.00000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 34 0.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 35 2.50000000000e-01 5.00000000000e-01 5.00000000000e-01 + 36 -2.50000000000e-01 5.00000000000e-01 5.00000000000e-01 + 37 0.00000000000e+00 5.00000000000e-01 0.00000000000e+00 + 38 0.00000000000e+00 5.00000000000e-01 -2.50000000000e-01 + 39 2.50000000000e-01 5.00000000000e-01 0.00000000000e+00 + 40 2.50000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 41 -2.50000000000e-01 5.00000000000e-01 0.00000000000e+00 + 42 -2.50000000000e-01 5.00000000000e-01 -2.50000000000e-01 + 43 0.00000000000e+00 5.00000000000e-01 2.50000000000e-01 + 44 2.50000000000e-01 5.00000000000e-01 2.50000000000e-01 + 45 -2.50000000000e-01 5.00000000000e-01 2.50000000000e-01 + 46 -5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 47 -5.00000000000e-01 0.00000000000e+00 5.00000000000e-01 + 48 -5.00000000000e-01 2.50000000000e-01 5.00000000000e-01 + 49 -5.00000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 50 0.00000000000e+00 -5.00000000000e-01 5.00000000000e-01 + 51 -2.50000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 52 2.50000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 53 0.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 54 0.00000000000e+00 -2.50000000000e-01 5.00000000000e-01 + 55 -2.50000000000e-01 0.00000000000e+00 5.00000000000e-01 + 56 -2.50000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 57 2.50000000000e-01 0.00000000000e+00 5.00000000000e-01 + 58 2.50000000000e-01 -2.50000000000e-01 5.00000000000e-01 + 59 0.00000000000e+00 2.50000000000e-01 5.00000000000e-01 + 60 -2.50000000000e-01 2.50000000000e-01 5.00000000000e-01 + 61 2.50000000000e-01 2.50000000000e-01 5.00000000000e-01 + 62 -5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 63 0.00000000000e+00 -5.00000000000e-01 -5.00000000000e-01 + 64 2.50000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 65 -2.50000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 66 -5.00000000000e-01 0.00000000000e+00 -5.00000000000e-01 + 67 -5.00000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 68 -5.00000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 69 0.00000000000e+00 0.00000000000e+00 -5.00000000000e-01 + 70 -2.50000000000e-01 0.00000000000e+00 -5.00000000000e-01 + 71 0.00000000000e+00 -2.50000000000e-01 -5.00000000000e-01 + 72 -2.50000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 73 0.00000000000e+00 2.50000000000e-01 -5.00000000000e-01 + 74 -2.50000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 75 2.50000000000e-01 0.00000000000e+00 -5.00000000000e-01 + 76 2.50000000000e-01 -2.50000000000e-01 -5.00000000000e-01 + 77 2.50000000000e-01 2.50000000000e-01 -5.00000000000e-01 + 78 -5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 79 -5.00000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 80 -5.00000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 81 0.00000000000e+00 -5.00000000000e-01 0.00000000000e+00 + 82 0.00000000000e+00 -5.00000000000e-01 -2.50000000000e-01 + 83 -2.50000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 84 -2.50000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 85 2.50000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 86 2.50000000000e-01 -5.00000000000e-01 -2.50000000000e-01 + 87 0.00000000000e+00 -5.00000000000e-01 2.50000000000e-01 + 88 -2.50000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 89 2.50000000000e-01 -5.00000000000e-01 2.50000000000e-01 + 90 -5.00000000000e-01 0.00000000000e+00 0.00000000000e+00 + 91 -5.00000000000e-01 0.00000000000e+00 2.50000000000e-01 + 92 -5.00000000000e-01 2.50000000000e-01 2.50000000000e-01 + 93 -5.00000000000e-01 2.50000000000e-01 0.00000000000e+00 + 94 -5.00000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 95 -5.00000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 96 -5.00000000000e-01 0.00000000000e+00 -2.50000000000e-01 + 97 -5.00000000000e-01 2.50000000000e-01 -2.50000000000e-01 + 98 -5.00000000000e-01 -2.50000000000e-01 -2.50000000000e-01 + 99 0.00000000000e+00 0.00000000000e+00 0.00000000000e+00 + 100 0.00000000000e+00 0.00000000000e+00 2.50000000000e-01 + 101 0.00000000000e+00 2.50000000000e-01 2.50000000000e-01 + 102 0.00000000000e+00 2.50000000000e-01 0.00000000000e+00 + 103 2.50000000000e-01 0.00000000000e+00 0.00000000000e+00 + 104 2.50000000000e-01 0.00000000000e+00 2.50000000000e-01 + 105 2.50000000000e-01 2.50000000000e-01 2.50000000000e-01 + 106 2.50000000000e-01 2.50000000000e-01 0.00000000000e+00 + 107 -2.50000000000e-01 0.00000000000e+00 0.00000000000e+00 + 108 -2.50000000000e-01 0.00000000000e+00 2.50000000000e-01 + 109 -2.50000000000e-01 2.50000000000e-01 2.50000000000e-01 + 110 -2.50000000000e-01 2.50000000000e-01 0.00000000000e+00 + 111 0.00000000000e+00 -2.50000000000e-01 2.50000000000e-01 + 112 0.00000000000e+00 -2.50000000000e-01 0.00000000000e+00 + 113 2.50000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 114 2.50000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 115 -2.50000000000e-01 -2.50000000000e-01 2.50000000000e-01 + 116 -2.50000000000e-01 -2.50000000000e-01 0.00000000000e+00 + 117 0.00000000000e+00 0.00000000000e+00 -2.50000000000e-01 + 118 0.00000000000e+00 2.50000000000e-01 -2.50000000000e-01 + 119 2.50000000000e-01 0.00000000000e+00 -2.50000000000e-01 + 120 2.50000000000e-01 2.50000000000e-01 -2.50000000000e-01 + 121 -2.50000000000e-01 0.00000000000e+00 -2.50000000000e-01 + 122 -2.50000000000e-01 2.50000000000e-01 -2.50000000000e-01 + 123 0.00000000000e+00 -2.50000000000e-01 -2.50000000000e-01 + 124 2.50000000000e-01 -2.50000000000e-01 -2.50000000000e-01 + 125 -2.50000000000e-01 -2.50000000000e-01 -2.50000000000e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.3.16 + 1 5 18 17 18 14 19 20 11 103 + 104 57 106 105 39 99 100 + 53 102 101 37 + 2 5 18 99 100 53 102 101 37 107 + 108 55 110 109 41 90 91 + 47 93 92 31 + 3 5 18 14 16 10 20 12 11 57 + 61 35 105 44 39 53 59 + 34 101 43 37 + 4 5 18 53 59 34 101 43 37 55 + 60 36 109 45 41 47 48 + 30 92 32 31 + 5 5 18 3 4 1 21 22 17 85 + 89 52 114 113 103 81 87 + 50 112 111 99 + 6 5 18 81 87 50 112 111 99 83 + 88 51 116 115 107 78 79 + 46 95 94 90 + 7 5 18 1 15 14 22 18 17 52 + 58 57 113 104 103 50 54 + 53 111 100 99 + 8 5 18 50 54 53 111 100 99 51 + 56 55 115 108 107 46 49 + 47 94 91 90 + 9 5 18 7 23 17 8 24 6 75 + 119 103 77 120 29 69 117 + 99 73 118 27 + 10 5 18 69 117 99 73 118 27 70 + 121 107 74 122 28 66 96 + 90 68 97 26 + 11 5 18 17 19 11 24 13 6 103 + 106 39 120 40 29 99 102 + 37 118 38 27 + 12 5 18 99 102 37 118 38 27 107 + 110 41 122 42 28 90 93 + 31 97 33 26 + 13 5 18 2 5 3 9 25 7 64 + 86 85 76 124 75 63 82 + 81 71 123 69 + 14 5 18 63 82 81 71 123 69 65 + 84 83 72 125 70 62 80 + 78 67 98 66 + 15 5 18 3 21 17 25 23 7 85 + 114 103 124 119 75 81 112 + 99 123 117 69 + 16 5 18 81 112 99 123 117 69 83 + 116 107 125 121 70 78 95 + 90 98 96 66 +ENDOFSECTION + ELEMENT GROUP 2.3.16 +GROUP: 1 ELEMENTS: 16 MATERIAL: 2 NFLAGS: 1 + 5 + 0 + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 1 1 24 0 6 + 14 5 1 + 13 5 1 + 6 5 1 + 5 5 1 + 2 5 5 + 4 5 5 + 6 5 5 + 8 5 5 + 10 5 5 + 12 5 5 + 14 5 5 + 16 5 5 + 11 5 2 + 12 5 2 + 3 5 2 + 4 5 2 + 1 5 4 + 3 5 4 + 5 5 4 + 7 5 4 + 9 5 4 + 11 5 4 + 13 5 4 + 15 5 4 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 2 1 8 0 6 + 14 5 3 + 10 5 3 + 13 5 3 + 9 5 3 + 8 5 1 + 7 5 1 + 4 5 1 + 3 5 1 +ENDOFSECTION diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_hex.dbs b/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_hex.dbs new file mode 100644 index 0000000000000000000000000000000000000000..5e064f2455a1a48c291df951686a06e947985685 GIT binary patch literal 151552 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

J8e+omLzm*9;HSML#__}-Z_w~zK+ainR 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 lo&G literal 0 HcmV?d00001 diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_mixed.lok b/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_mixed.lok new file mode 100644 index 000000000..3e135d9e9 --- /dev/null +++ b/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_mixed.lok @@ -0,0 +1 @@ +Marker file diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_tet.dbs b/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_tet.dbs new file mode 100644 index 0000000000000000000000000000000000000000..dd0049aaeb698c63c2515969ff3660c4c7059923 GIT binary patch literal 204800 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 literal 0 HcmV?d00001 diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_wedge.dbs b/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/cube_wedge.dbs new file mode 100644 index 0000000000000000000000000000000000000000..92e8b4afd8b2bd3163ab7c3325b6520c25a6b385 GIT binary patch literal 151552 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 j+#3~!d#l25Tb;j|3gwFafpk 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 HkP!Yq>!V=! literal 0 HcmV?d00001 diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/square_tri.dbs b/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/square_tri.dbs new file mode 100644 index 0000000000000000000000000000000000000000..41f2a376be468a37fd10005c6def04a0b710ec2a GIT binary patch literal 131072 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 literal 0 HcmV?d00001 diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/tet.dbs b/applications/NumPdeSpring2015/Eugenio/Ex3/input/gambit/tet.dbs new file mode 100644 index 0000000000000000000000000000000000000000..5d5f7139823fb7daa0944597477dad8cc372804c GIT binary patch literal 135168 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 z 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 KZGqNV;Qs+HF0GmX literal 0 HcmV?d00001 diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/square_mixed.neu b/applications/NumPdeSpring2015/Eugenio/Ex3/input/square_mixed.neu new file mode 100644 index 000000000..4741f936d --- /dev/null +++ b/applications/NumPdeSpring2015/Eugenio/Ex3/input/square_mixed.neu @@ -0,0 +1,62 @@ + CONTROL INFO 2.3.16 +** GAMBIT NEUTRAL FILE +square_mixed +PROGRAM: Gambit VERSION: 2.3.16 +14 Mar 2015 10:14:23 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 25 6 1 1 2 2 +ENDOFSECTION + NODAL COORDINATES 2.3.16 + 1 5.00000000000e-01 0.00000000000e+00 + 2 -5.00000000000e-01 0.00000000000e+00 + 3 0.00000000000e+00 0.00000000000e+00 + 4 2.50000000000e-01 0.00000000000e+00 + 5 -2.50000000000e-01 0.00000000000e+00 + 6 -5.00000000000e-01 -5.00000000000e-01 + 7 -5.00000000000e-01 -2.50000000000e-01 + 8 5.00000000000e-01 -5.00000000000e-01 + 9 0.00000000000e+00 -5.00000000000e-01 + 10 -2.50000000000e-01 -5.00000000000e-01 + 11 2.50000000000e-01 -5.00000000000e-01 + 12 5.00000000000e-01 -2.50000000000e-01 + 13 0.00000000000e+00 -2.50000000000e-01 + 14 2.50000000000e-01 -2.50000000000e-01 + 15 -2.50000000000e-01 -2.50000000000e-01 + 16 5.00000000000e-01 5.00000000000e-01 + 17 5.00000000000e-01 2.50000000000e-01 + 18 -5.00000000000e-01 5.00000000000e-01 + 19 0.00000000000e+00 5.00000000000e-01 + 20 2.50000000000e-01 5.00000000000e-01 + 21 -2.50000000000e-01 5.00000000000e-01 + 22 -5.00000000000e-01 2.50000000000e-01 + 23 0.00000000000e+00 2.50000000000e-01 + 24 -2.50000000000e-01 2.50000000000e-01 + 25 2.50000000000e-01 2.50000000000e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.3.16 + 1 2 9 8 12 1 4 3 13 9 + 11 14 + 2 2 9 9 13 3 5 2 7 6 + 10 15 + 3 3 6 2 5 3 23 19 24 + 4 3 6 18 22 2 24 19 21 + 5 3 6 3 4 1 17 16 25 + 6 3 6 19 23 3 25 16 20 +ENDOFSECTION + ELEMENT GROUP 2.3.16 +GROUP: 1 ELEMENTS: 6 MATERIAL: 2 NFLAGS: 1 + 5 + 0 + 3 4 5 6 1 2 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 1 1 8 0 6 + 2 2 3 + 5 3 2 + 6 3 3 + 4 3 3 + 1 2 1 + 2 2 4 + 1 2 4 + 4 3 1 +ENDOFSECTION diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/square_quad.neu b/applications/NumPdeSpring2015/Eugenio/Ex3/input/square_quad.neu new file mode 100644 index 000000000..b19922a5f --- /dev/null +++ b/applications/NumPdeSpring2015/Eugenio/Ex3/input/square_quad.neu @@ -0,0 +1,62 @@ + CONTROL INFO 2.3.16 +** GAMBIT NEUTRAL FILE +square_quad +PROGRAM: Gambit VERSION: 2.3.16 +13 Mar 2015 15:25:47 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 25 4 1 1 2 2 +ENDOFSECTION + NODAL COORDINATES 2.3.16 + 1 -5.00000000000e-01 -5.00000000000e-01 + 2 5.00000000000e-01 -5.00000000000e-01 + 3 0.00000000000e+00 -5.00000000000e-01 + 4 -2.50000000000e-01 -5.00000000000e-01 + 5 2.50000000000e-01 -5.00000000000e-01 + 6 5.00000000000e-01 5.00000000000e-01 + 7 5.00000000000e-01 0.00000000000e+00 + 8 5.00000000000e-01 -2.50000000000e-01 + 9 5.00000000000e-01 2.50000000000e-01 + 10 -5.00000000000e-01 5.00000000000e-01 + 11 0.00000000000e+00 5.00000000000e-01 + 12 2.50000000000e-01 5.00000000000e-01 + 13 -2.50000000000e-01 5.00000000000e-01 + 14 -5.00000000000e-01 0.00000000000e+00 + 15 -5.00000000000e-01 2.50000000000e-01 + 16 -5.00000000000e-01 -2.50000000000e-01 + 17 0.00000000000e+00 0.00000000000e+00 + 18 0.00000000000e+00 -2.50000000000e-01 + 19 -2.50000000000e-01 0.00000000000e+00 + 20 -2.50000000000e-01 -2.50000000000e-01 + 21 2.50000000000e-01 0.00000000000e+00 + 22 2.50000000000e-01 -2.50000000000e-01 + 23 0.00000000000e+00 2.50000000000e-01 + 24 -2.50000000000e-01 2.50000000000e-01 + 25 2.50000000000e-01 2.50000000000e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.3.16 + 1 2 9 1 4 3 18 17 19 14 + 16 20 + 2 2 9 3 5 2 8 7 21 17 + 18 22 + 3 2 9 14 19 17 23 11 13 10 + 15 24 + 4 2 9 17 21 7 9 6 12 11 + 23 25 +ENDOFSECTION + ELEMENT GROUP 2.3.16 +GROUP: 1 ELEMENTS: 4 MATERIAL: 2 NFLAGS: 1 + 5 + 0 + 1 2 3 4 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 1 1 8 0 6 + 4 2 3 + 3 2 3 + 2 2 2 + 4 2 2 + 1 2 1 + 2 2 1 + 3 2 4 + 1 2 4 +ENDOFSECTION diff --git a/applications/NumPdeSpring2015/Eugenio/Ex3/input/square_tri.neu b/applications/NumPdeSpring2015/Eugenio/Ex3/input/square_tri.neu new file mode 100644 index 000000000..089a3366c --- /dev/null +++ b/applications/NumPdeSpring2015/Eugenio/Ex3/input/square_tri.neu @@ -0,0 +1,62 @@ + CONTROL INFO 2.3.16 +** GAMBIT NEUTRAL FILE +square_tri +PROGRAM: Gambit VERSION: 2.3.16 +13 Mar 2015 15:31:40 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 25 8 1 1 2 2 +ENDOFSECTION + NODAL COORDINATES 2.3.16 + 1 -5.00000000000e-01 -5.00000000000e-01 + 2 5.00000000000e-01 -5.00000000000e-01 + 3 0.00000000000e+00 -5.00000000000e-01 + 4 -2.50000000000e-01 -5.00000000000e-01 + 5 2.50000000000e-01 -5.00000000000e-01 + 6 5.00000000000e-01 5.00000000000e-01 + 7 5.00000000000e-01 0.00000000000e+00 + 8 5.00000000000e-01 -2.50000000000e-01 + 9 5.00000000000e-01 2.50000000000e-01 + 10 -5.00000000000e-01 5.00000000000e-01 + 11 0.00000000000e+00 5.00000000000e-01 + 12 2.50000000000e-01 5.00000000000e-01 + 13 -2.50000000000e-01 5.00000000000e-01 + 14 -5.00000000000e-01 0.00000000000e+00 + 15 -5.00000000000e-01 2.50000000000e-01 + 16 -5.00000000000e-01 -2.50000000000e-01 + 17 0.00000000000e+00 0.00000000000e+00 + 18 0.00000000000e+00 -2.50000000000e-01 + 19 -2.50000000000e-01 0.00000000000e+00 + 20 -2.50000000000e-01 -2.50000000000e-01 + 21 2.50000000000e-01 0.00000000000e+00 + 22 2.50000000000e-01 -2.50000000000e-01 + 23 0.00000000000e+00 2.50000000000e-01 + 24 -2.50000000000e-01 2.50000000000e-01 + 25 2.50000000000e-01 2.50000000000e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.3.16 + 1 3 6 3 18 17 19 14 20 + 2 3 6 1 4 3 20 14 16 + 3 3 6 2 8 7 21 17 22 + 4 3 6 3 5 2 22 17 18 + 5 3 6 17 23 11 13 10 24 + 6 3 6 14 19 17 24 10 15 + 7 3 6 7 9 6 12 11 25 + 8 3 6 17 21 7 25 11 23 +ENDOFSECTION + ELEMENT GROUP 2.3.16 +GROUP: 1 ELEMENTS: 8 MATERIAL: 2 NFLAGS: 1 + 5 + 0 + 1 2 3 4 5 6 7 8 +ENDOFSECTION + BOUNDARY CONDITIONS 2.3.16 + 1 1 8 0 6 + 7 3 2 + 5 3 2 + 3 3 1 + 7 3 1 + 2 3 1 + 4 3 1 + 6 3 3 + 2 3 3 +ENDOFSECTION From f47af4ae48fd4c74e1e859a22c06af16afb6a896 Mon Sep 17 00:00:00 2001 From: eugenio aulisa Date: Tue, 7 Apr 2015 06:30:16 -0500 Subject: [PATCH 13/19] FSI back working --- applications/FSI/FSITimeDependentBenchmarks/main.cpp | 12 ++++++------ .../IncompressibleFSIAssemblyTimeDependent.hpp | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/applications/FSI/FSITimeDependentBenchmarks/main.cpp b/applications/FSI/FSITimeDependentBenchmarks/main.cpp index 0f2bb23c7..2a6956406 100644 --- a/applications/FSI/FSITimeDependentBenchmarks/main.cpp +++ b/applications/FSI/FSITimeDependentBenchmarks/main.cpp @@ -168,14 +168,14 @@ int main(int argc,char **args) { muf = 1.; rhos = 10000.; ni = 0.5; - E = 1400000*(1.5/1.4); + E = 1400000/1.5; } else if (turek_FSI == 3){ //Turek-Hron FSI3 rhof = 1000.; muf = 1.; rhos = 1000.; ni = 0.5; - E = 5600000*(1.5/1.4); + E = 5600000; } } else if(simulation==3){ //bathe 2D @@ -410,8 +410,8 @@ double SetVariableTimeStep(const double time) { double dt = 1.; if( turek_FSI == 2 ){ if ( time < 5. ) dt = 0.1; - else if ( time < 6.5 ) dt = 0.05; - else dt = 0.01; + else if ( time < 9 ) dt = 0.05; + else dt = 0.025; } else if ( turek_FSI == 3 ){ if ( time < 5. ) dt = 0.1; @@ -452,8 +452,8 @@ bool SetBoundaryConditionTurek_2D_FSI_and_solid(const double &x, const double &y if(1==facename){ //inflow test = 1; double um = 0.2; - if( turek_FSI == 2 ) um = 2.; - if( turek_FSI == 3 ) um = 1.; + if( turek_FSI == 2 ) um = 1.; + if( turek_FSI == 3 ) um = 2.; if(time < 2.0) { value = 1.5 * um * 4.0 / 0.1681 * y * ( 0.41 - y) * 0.5 * ( 1. - cos( 0.5 * 3.141592653589793 * time) ); diff --git a/applications/FSI/include/IncompressibleFSIAssemblyTimeDependent.hpp b/applications/FSI/include/IncompressibleFSIAssemblyTimeDependent.hpp index 73479d65a..c4cc46430 100644 --- a/applications/FSI/include/IncompressibleFSIAssemblyTimeDependent.hpp +++ b/applications/FSI/include/IncompressibleFSIAssemblyTimeDependent.hpp @@ -632,14 +632,14 @@ namespace femus { -B_old[0][1] * B_old[1][0] - B_old[1][2] * B_old[2][1] - B_old[2][0]*B_old[0][2]; double C1 = mus/2.; - double C2 = 0.*C1; + double C2 = 0.5*C1; for (int I=0; I<3; ++I) { for (int J=0; J<3; ++J) { - Cauchy[I][J] = 2.*C1*B[I][J] - 2.*C2*invB[I][J] + Cauchy[I][J] = 2.*C1*(B[I][J]-0.*Id2th[I][J]) - 2.*(C2*invB[I][J]-0.*Id2th[I][J]) -(2./3.)*(C1*I1_B - C2*I2_B )* SolVAR[2*dim]*Id2th[I][J]; - Cauchy_old[I][J] = 2.*C1*B_old[I][J] - 2.*C2*invB_old[I][J] + Cauchy_old[I][J] = 2.*C1*(B_old[I][J]-0.*Id2th[I][J]) - 2.*C2*(invB_old[I][J]-0.*Id2th[I][J]) -(2./3.)*(C1*I1_B_old - C2*I2_B_old )* SolVAR[2*dim]*Id2th[I][J]; //std::cout< Date: Tue, 7 Apr 2015 10:07:03 -0500 Subject: [PATCH 14/19] checking FSI 3D output --- applications/FSI/FSITimeDependentBenchmarks/main.cpp | 12 +++++++----- .../IncompressibleFSIAssemblyTimeDependent.hpp | 12 ++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/applications/FSI/FSITimeDependentBenchmarks/main.cpp b/applications/FSI/FSITimeDependentBenchmarks/main.cpp index 2a6956406..6dcc67313 100644 --- a/applications/FSI/FSITimeDependentBenchmarks/main.cpp +++ b/applications/FSI/FSITimeDependentBenchmarks/main.cpp @@ -168,7 +168,7 @@ int main(int argc,char **args) { muf = 1.; rhos = 10000.; ni = 0.5; - E = 1400000/1.5; + E = 1400000; } else if (turek_FSI == 3){ //Turek-Hron FSI3 rhof = 1000.; @@ -183,14 +183,14 @@ int main(int argc,char **args) { muf = 0.04; rhos = 800; ni = 0.5; - E = 120000000; + E = 180000000; } else if(simulation<7){ //bathe 3D rhof = 100.; muf = 1.; rhos = 800; ni = 0.5; - E = 1200000; + E = 1800000; } else if(simulation==7){ //comsol rhof = 1000.; @@ -419,7 +419,9 @@ double SetVariableTimeStep(const double time) { else dt = 0.01; } else if ( simulation == 3 ) dt=0.001; - else if ( simulation == 4 ) dt=0.01; + else if ( simulation == 4 ) dt=0.1; + else if ( simulation == 5 ) dt=0.1; + else if ( simulation == 6 ) dt=0.1; else if ( simulation == 7 ) dt=0.001; else{ std::cout << "Warning this simulation case has not been considered yet for the time dependent case"< Date: Tue, 7 Apr 2015 19:49:39 -0500 Subject: [PATCH 15/19] VelocityAdj with scalar components in mhdopt --- .../OptimalControl/mhdopt/EqnMHDAD.cpp | 75 ++++--- .../OptimalControl/mhdopt/EqnMHDCONT.cpp | 84 +++---- .../OptimalControl/mhdopt/EqnNSAD.cpp | 139 ++++++------ .../OptimalControl/mhdopt/OptQuantities.cpp | 206 +++++++++++++----- .../OptimalControl/mhdopt/OptQuantities.hpp | 33 ++- .../OptimalControl/mhdopt/input/femus_conf.in | 4 - applications/OptimalControl/mhdopt/main.cpp | 20 +- 7 files changed, 362 insertions(+), 199 deletions(-) diff --git a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp index 27bb0a95a..ec5483a90 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp @@ -28,25 +28,20 @@ using namespace femus; SystemTwo & my_system = ml_prob.get_system("Eqn_MHDAD"); - const double time = 0.; //ml_prob._timeloop._curr_time; - //========= parameters double IRem = 1./ml_prob.GetInputParser().get("Rem"); double S = ml_prob.GetInputParser().get("S"); - //=========== Operators +//======== GEOMETRICAL ELEMENT ======= + const uint space_dim = ml_prob._ml_msh->GetDimension(); + //=========== Operators + std::vector VelAdj_vec_val_g(space_dim); + std::vector VelAdj_vec_val_g3D(3); double dphijdx_g[DIMENSION]; double dphiidx_g[DIMENSION]; double curlBXlambda_g3D[3]; -//======= TIME - STATIONARY OR NOT ======= -const int NonStatMHDAD = (int) ml_prob.GetInputParser().get("NonStatMHDAD"); - const double dt = 1.; //ml_prob._timeloop._timemap.get("dt"); - -//======== GEOMETRICAL ELEMENT ======= - const uint space_dim = ml_prob._ml_msh->GetDimension(); - my_system._LinSolver[Level]->_KK->zero(); my_system._LinSolver[Level]->_RESC->zero(); @@ -121,12 +116,27 @@ const int NonStatMHDAD = (int) ml_prob.GetInputParser().get("NonStatMHDAD"); Vel_vec.push_back(&VelY); Vel_vec.push_back(&VelZ); - //========== - CurrentQuantity VelAdj(currgp); - VelAdj._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_VelocityAdj"); - VelAdj.VectWithQtyFillBasic(); - VelAdj.Allocate(); - + //========== + CurrentQuantity VelAdjX(currgp); + VelAdjX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_VelocityAdj0"); + VelAdjX.VectWithQtyFillBasic(); + VelAdjX.Allocate(); + + CurrentQuantity VelAdjY(currgp); + VelAdjY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_VelocityAdj1"); + VelAdjY.VectWithQtyFillBasic(); + VelAdjY.Allocate(); + + CurrentQuantity VelAdjZ(currgp); + VelAdjZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_VelocityAdj2"); + VelAdjZ.VectWithQtyFillBasic(); + VelAdjZ.Allocate(); + + std::vector VelAdj_vec; + VelAdj_vec.push_back(&VelAdjX); + VelAdj_vec.push_back(&VelAdjY); + VelAdj_vec.push_back(&VelAdjZ); + //========== CurrentQuantity Bhom(currgp); Bhom._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom"); @@ -167,15 +177,15 @@ const int NonStatMHDAD = (int) ml_prob.GetInputParser().get("NonStatMHDAD"); for (uint idim=0; idim < space_dim; idim++) { if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); - else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],time,&xyz_refbox._val_dofs[0]); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); + if ( VelAdj_vec[idim]->_eqnptr != NULL) VelAdj_vec[idim]->GetElemDofs(); + else VelAdj_vec[idim]->_qtyptr->FunctionDof(*VelAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); } - if ( VelAdj._eqnptr != NULL ) VelAdj.GetElemDofs(); - else VelAdj._qtyptr->FunctionDof(VelAdj,time,&xyz_refbox._val_dofs[0]); if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); - else Bhom._qtyptr->FunctionDof(Bhom,time,&xyz_refbox._val_dofs[0]); + else Bhom._qtyptr->FunctionDof(Bhom,0.,&xyz_refbox._val_dofs[0]); if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); - else Bext._qtyptr->FunctionDof(Bext,time,&xyz_refbox._val_dofs[0]); + else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); //======SUM Bhom and Bext //from now on, you'll only use Bmag //Bmag,Bext and Bhom must have the same orders! Math::zeroN(&Bmag._val_dofs[0],Bmag._dim*Bmag._ndof); @@ -198,7 +208,7 @@ for (uint fe = 0; fe < QL; fe++) { currgp.SetDPhiDxezetaElDofsFEVB_g (fe,qp); } -const double det = dt*currgp.JacVectVV_g(xyz); //InvJac: is the same for both QQ and LL! +const double det = currgp.JacVectVV_g(xyz); //InvJac: is the same for both QQ and LL! const double dtxJxW_g = det * ml_prob.GetQrule(currelem.GetDim()).GetGaussWeight(qp); const double detb = det/el_ngauss; @@ -211,13 +221,16 @@ for (uint fe = 0; fe < QL; fe++) { BhomAdjOld.val_g(); Bmag.curl_g(); Bmag.val_g(); - VelAdj.val_g(); - for (uint idim=0; idimval_g(); + for (uint idim=0; idimval_g(); + VelAdj_vec[idim]->val_g(); + VelAdj_vec_val_g[idim] = VelAdj_vec[idim]->_val_g[0]; + } //vector product - Math::extend(&VelAdj._val_g[0],&VelAdj._val_g3D[0],space_dim); - Math::cross(&Bmag._curl_g3D[0],&VelAdj._val_g3D[0],curlBXlambda_g3D); + Math::extend(&VelAdj_vec_val_g[0],&VelAdj_vec_val_g3D[0],space_dim); + Math::cross(&Bmag._curl_g3D[0],&VelAdj_vec_val_g3D[0],curlBXlambda_g3D); //============================================================== //========= FILLING ELEMENT MAT/RHS (i loop) ==================== @@ -230,14 +243,13 @@ for (uint fe = 0; fe < QL; fe++) { //======= END "COMMON tEST PART for QTYZERO" ========== double BDdphii_g = Math::dot( &Bmag._val_g[0],dphiidx_g,space_dim); - double lambdaDdphii_g = Math::dot(&VelAdj._val_g[0],dphiidx_g,space_dim); + double lambdaDdphii_g = Math::dot(&VelAdj_vec_val_g[0],dphiidx_g,space_dim); for (uint idim=0; idim_val_g[0] ) @@ -406,12 +417,12 @@ for (uint fe = 0; fe < QL; fe++) { currgp.SetDPhiDxezetaElDofsFEVB_g (fe,qp); } - const double det = dt*currgp.JacVectBB_g(xyz); + const double det = currgp.JacVectBB_g(xyz); const double dtxJxW_g = det * ml_prob.GetQrule(currelem.GetDim()).GetGaussWeight(qp); //=======end "COMMON SHAPE PART"=================================== xyz_refbox.val_g(); - BhomLagMultAdjOld._qtyptr->Function_txyz(time,&xyz_refbox._val_g[0]/*xyz._val_g*/,&BhomLagMultAdjOld._val_g[0]); //i prefer using the function instead of the p_old vector + BhomLagMultAdjOld._qtyptr->Function_txyz(0.,&xyz_refbox._val_g[0]/*xyz._val_g*/,&BhomLagMultAdjOld._val_g[0]); //i prefer using the function instead of the p_old vector //============================================================== //========= FILLING ELEMENT MAT/RHS (i loop) =================== diff --git a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp index d0cd9887e..846e20c36 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp @@ -31,12 +31,6 @@ using namespace femus; SystemTwo & my_system = ml_prob.get_system("Eqn_MHDCONT"); - const double time = 0.; //ml_prob._timeloop._curr_time; - -//======= TIME - STATIONARY OR NOT ======= - const int NonStatMHDCONT = (int) ml_prob.GetInputParser().get("NonStatMHDCONT"); - const double dt = 1.; //ml_prob._timeloop._timemap.get("dt"); - //======== GEOMETRICAL ELEMENT ======= const uint space_dim = ml_prob._ml_msh->GetDimension(); @@ -50,6 +44,8 @@ using namespace femus; //==== Operators @ gauss ======== std::vector Vel_vec_val_g(space_dim); std::vector Vel_vec_val_g3D(3); + std::vector VelAdj_vec_val_g(space_dim); + std::vector VelAdj_vec_val_g3D(3); double dphijdx_g[DIMENSION]; double dphiidx_g[DIMENSION]; double dphiidx_g3D[3]; @@ -131,12 +127,27 @@ using namespace femus; Vel_vec.push_back(&VelZ); #endif - //================== - CurrentQuantity VelAdj(currgp); - VelAdj._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_VelocityAdj"); - VelAdj.VectWithQtyFillBasic(); - VelAdj.Allocate(); - + //========== + CurrentQuantity VelAdjX(currgp); + VelAdjX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_VelocityAdj0"); + VelAdjX.VectWithQtyFillBasic(); + VelAdjX.Allocate(); + + CurrentQuantity VelAdjY(currgp); + VelAdjY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_VelocityAdj1"); + VelAdjY.VectWithQtyFillBasic(); + VelAdjY.Allocate(); + + CurrentQuantity VelAdjZ(currgp); + VelAdjZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_VelocityAdj2"); + VelAdjZ.VectWithQtyFillBasic(); + VelAdjZ.Allocate(); + + std::vector VelAdj_vec; + VelAdj_vec.push_back(&VelAdjX); + VelAdj_vec.push_back(&VelAdjY); + VelAdj_vec.push_back(&VelAdjZ); + //================== CurrentQuantity Bhom(currgp); Bhom._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom"); @@ -168,15 +179,15 @@ using namespace femus; for (uint idim=0; idim < space_dim; idim++) { if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); - else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],time,&xyz_refbox._val_dofs[0]); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); + if ( VelAdj_vec[idim]->_eqnptr != NULL) VelAdj_vec[idim]->GetElemDofs(); + else VelAdj_vec[idim]->_qtyptr->FunctionDof(*VelAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); } - if ( VelAdj._eqnptr != NULL ) VelAdj.GetElemDofs(); - else VelAdj._qtyptr->FunctionDof(VelAdj,time,&xyz_refbox._val_dofs[0]); if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); - else Bhom._qtyptr->FunctionDof(Bhom,time,&xyz_refbox._val_dofs[0]); + else Bhom._qtyptr->FunctionDof(Bhom,0.,&xyz_refbox._val_dofs[0]); if ( BhomAdj._eqnptr != NULL ) BhomAdj.GetElemDofs(); - else BhomAdj._qtyptr->FunctionDof(BhomAdj,time,&xyz_refbox._val_dofs[0]); + else BhomAdj._qtyptr->FunctionDof(BhomAdj,0.,&xyz_refbox._val_dofs[0]); //============================================================== @@ -192,7 +203,7 @@ for (uint fe = 0; fe < QL; fe++) { currgp.SetDPhiDxezetaElDofsFEVB_g (fe,qp); } - const double det = dt*currgp.JacVectVV_g(xyz); //InvJac: is unique! + const double det = currgp.JacVectVV_g(xyz); //InvJac: is unique! const double dtxJxW_g = det*ml_prob.GetQrule(currelem.GetDim()).GetGaussWeight(qp); const double detb = det/el_ngauss; @@ -206,21 +217,22 @@ for (uint fe = 0; fe < QL; fe++) { BhomAdj.curl_g(); Bhom.curl_g(); BeOld.val_g(); - VelAdj.val_g(); Bhom.val_g(); BhomAdj.grad_g(); for (uint idim=0; idimval_g(); - Vel_vec_val_g[idim] = Vel_vec[idim]->_val_g[0]; + Vel_vec[idim]->val_g(); + VelAdj_vec[idim]->val_g(); + Vel_vec_val_g[idim] = Vel_vec[idim]->_val_g[0]; + VelAdj_vec_val_g[idim] = VelAdj_vec[idim]->_val_g[0]; } // vector product Math::extend( &Vel_vec_val_g[0], &Vel_vec_val_g3D[0],space_dim); - Math::extend(&VelAdj._val_g[0],&VelAdj._val_g3D[0],space_dim); + Math::extend(&VelAdj_vec_val_g[0],&VelAdj_vec_val_g3D[0],space_dim); Math::cross(&BhomAdj._curl_g3D[0], &Vel_vec_val_g3D[0],curlxiXvel_g3D ); - Math::cross( &Bhom._curl_g3D[0],&VelAdj._val_g3D[0],curlbXlambda_g3D ); + Math::cross( &Bhom._curl_g3D[0],&VelAdj_vec_val_g3D[0],curlbXlambda_g3D ); //========end preparation for things that are independent of (i,j) dofs of test and shape ===================== //================================ @@ -243,7 +255,7 @@ for (uint fe = 0; fe < QL; fe++) { Math::cross(&BhomAdj._curl_g3D[0],dphiidx_g3D,curlxiXdphii_g3D); double bDdphii_g = Math::dot( &Bhom._val_g[0],dphiidx_g,space_dim); - double lambdaDdphii_g = Math::dot(&VelAdj._val_g[0],dphiidx_g,space_dim); + double lambdaDdphii_g = Math::dot(&VelAdj_vec_val_g[0],dphiidx_g,space_dim); for (uint idim=0; idim_val_g[0] - lambdaDdphii_g*Bhom._val_g[idim]) //from NS ) +(1-currelem.GetBCDofFlag()[irowq])*detb*BeOld._val_dofs[irowq]; //Dirichlet bc } @@ -283,8 +294,8 @@ for (uint fe = 0; fe < QL; fe++) { for (uint idim=0; idim_val_g[0]*dphiidx_g[idim] ) + + S*phii_g*(lambdaDdphij_g - VelAdj_vec[idim]->_val_g[0]*dphijdx_g[idim] ) ); // block +1 [2-6-7] int idimp1=(idim+1)%space_dim; currelem.Mat()(irowq,j+idimp1*BeOld._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( - + S*phij_g*( -VelAdj._val_g[idim]*dphiidx_g[idimp1]) - + S*phii_g*( -VelAdj._val_g[idimp1]*dphijdx_g[idim]) + + S*phij_g*( -VelAdj_vec[idim]->_val_g[0]*dphiidx_g[idimp1]) + + S*phii_g*( -VelAdj_vec[idimp1]->_val_g[0]*dphijdx_g[idim]) ); #if (DIMENSION==3) // block +2 [3-4-8] int idimp2=(idim+2)%space_dim; currelem.Mat()(irowq,j+idimp2*BeOld._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( - + S*phij_g*( -VelAdj._val_g[idim]*dphiidx_g[idimp2]) - + S*phii_g*( -VelAdj._val_g[idimp2]*dphijdx_g[idim]) + + S*phij_g*( -VelAdj_vec[idim]->_val_g[0]*dphiidx_g[idimp2]) + + S*phii_g*( -VelAdj_vec[idimp2]->_val_g[0]*dphijdx_g[idim]) ); #endif } @@ -459,12 +469,12 @@ for (uint fe = 0; fe < QL; fe++) { currgp.SetDPhiDxezetaElDofsFEVB_g (fe,qp); } - const double det = dt*currgp.JacVectBB_g(xyz); + const double det = currgp.JacVectBB_g(xyz); const double dtxJxW_g = det*ml_prob.GetQrule(currelem.GetDim()).GetGaussWeight(qp); //=======end "COMMON SHAPE PART"=================================== xyz_refbox.val_g(); - LagMultOld._qtyptr->Function_txyz(time,&xyz_refbox._val_g[0]/*xyz._val_g*/,&LagMultOld._val_g[0]); //i prefer using the function instead of the p_old vector + LagMultOld._qtyptr->Function_txyz(0.,&xyz_refbox._val_g[0]/*xyz._val_g*/,&LagMultOld._val_g[0]); //i prefer using the function instead of the p_old vector //============================================================== //========= FILLING ELEMENT MAT/RHS (i loop) ==================== diff --git a/applications/OptimalControl/mhdopt/EqnNSAD.cpp b/applications/OptimalControl/mhdopt/EqnNSAD.cpp index d9220c008..b31681827 100644 --- a/applications/OptimalControl/mhdopt/EqnNSAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnNSAD.cpp @@ -38,12 +38,6 @@ using namespace femus; double dphiidx_g[DIMENSION]; double curlxiXB_g3D[3]; - const double time = 0.; //ml_prob._timeloop._curr_time; - -//======= TIME - STATIONARY OR NOT ======= -const int NonStatNSAD = (int) ml_prob.GetInputParser().get("NonStatNSAD"); - const double dt = 1.; //ml_prob._timeloop._timemap.get("dt"); - // //======== GEOMETRICAL ELEMENT ======= const uint space_dim = ml_prob._ml_msh->GetDimension(); @@ -70,15 +64,28 @@ const int NonStatNSAD = (int) ml_prob.GetInputParser().get("NonStatNSAD"); CurrentGaussPointBase & currgp = CurrentGaussPointBase::build(currelem,ml_prob.GetQrule(currelem.GetDim())); //=========INTERNAL QUANTITIES (unknowns of the equation) ================== - //QTYZERO - CurrentQuantity VelAdjOld(currgp); - VelAdjOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYZERO]; - VelAdjOld.VectWithQtyFillBasic(); - VelAdjOld.Allocate(); - - //QTYONE + CurrentQuantity VelAdjOldX(currgp); + VelAdjOldX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_VelocityAdj0"); + VelAdjOldX.VectWithQtyFillBasic(); + VelAdjOldX.Allocate(); + + CurrentQuantity VelAdjOldY(currgp); + VelAdjOldY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_VelocityAdj1"); + VelAdjOldY.VectWithQtyFillBasic(); + VelAdjOldY.Allocate(); + + CurrentQuantity VelAdjOldZ(currgp); + VelAdjOldZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_VelocityAdj2"); + VelAdjOldZ.VectWithQtyFillBasic(); + VelAdjOldZ.Allocate(); + + std::vector VelAdjOld_vec; + VelAdjOld_vec.push_back(&VelAdjOldX); + VelAdjOld_vec.push_back(&VelAdjOldY); + VelAdjOld_vec.push_back(&VelAdjOldZ); + CurrentQuantity PressAdjOld(currgp); - PressAdjOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYONE]; + PressAdjOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_PressureAdj"); PressAdjOld.VectWithQtyFillBasic(); PressAdjOld.Allocate(); //========= END INTERNAL QUANTITIES (unknowns of the equation) ================= @@ -183,21 +190,21 @@ const int NonStatNSAD = (int) ml_prob.GetInputParser().get("NonStatNSAD"); currelem.SetElDofsBc(); - VelAdjOld.GetElemDofs(); PressAdjOld.GetElemDofs(); if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); - else Bhom._qtyptr->FunctionDof(Bhom,time,&xyz_refbox._val_dofs[0]); + else Bhom._qtyptr->FunctionDof(Bhom,0.,&xyz_refbox._val_dofs[0]); if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); - else Bext._qtyptr->FunctionDof(Bext,time,&xyz_refbox._val_dofs[0]); + else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); if ( BhomAdj._eqnptr != NULL ) BhomAdj.GetElemDofs(); - else BhomAdj._qtyptr->FunctionDof(BhomAdj,time,&xyz_refbox._val_dofs[0]); + else BhomAdj._qtyptr->FunctionDof(BhomAdj,0.,&xyz_refbox._val_dofs[0]); for (uint idim=0; idim < space_dim; idim++) { + VelAdjOld_vec[idim]->GetElemDofs(); if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); - else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],time,&xyz_refbox._val_dofs[0]); //give the Hartmann flow, if not solving NS + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); //give the Hartmann flow, if not solving NS if ( VelDes_vec[idim]->_eqnptr != NULL ) VelDes_vec[idim]->GetElemDofs(); - else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],time,&xyz_refbox._val_dofs[0]); + else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],0.,&xyz_refbox._val_dofs[0]); } //======SUM Bhom and Bext //from now on, you'll only use Bmag //Bmag,Bext and Bhom must have the same orders! @@ -227,7 +234,7 @@ for (uint fe = 0; fe < QL; fe++) { currgp.SetDPhiDxezetaElDofsFEVB_g (fe,qp); } -const double det = dt*currgp.JacVectVV_g(xyz); //InvJac: is the same for both QQ and LL! +const double det = currgp.JacVectVV_g(xyz); //InvJac: is the same for both QQ and LL! const double dtxJxW_g = det*ml_prob.GetQrule(currelem.GetDim()).GetGaussWeight(qp); const double detb = det/el_ngauss; @@ -237,11 +244,11 @@ for (uint fe = 0; fe < QL; fe++) { } //=======end of the "COMMON SHAPE PART"================== - VelAdjOld.val_g(); BhomAdj.curl_g(); Bmag.val_g(); for (uint idim=0; idim < space_dim; idim++) { + VelAdjOld_vec[idim]->val_g(); VelDes_vec[idim]->val_g(); Vel_vec[idim]->val_g(); Vel_vec[idim]->grad_g(); @@ -254,50 +261,46 @@ for (uint fe = 0; fe < QL; fe++) { //============================================================== //========= FILLING ELEMENT MAT/RHS (i loop) ==================== //============================================================== - for (uint i = 0; i < VelAdjOld._ndof; i++) { -//======="COMMON tEST PART for QTYZERO": func and derivative, of the QTYZERO FE ORD ========== - const double phii_g = currgp._phi_ndsQLVB_g[VelAdjOld._FEord][i]; - for (uint idim=0; idim_val_g[0] - VelDes_vec[idim]->_val_g[0])*phii_g //this is the dependence that counts ) - + (1-currelem.GetBCDofFlag()[irowq])*detb*VelAdjOld._val_dofs[irowq]; //Dirichlet bc + + (1-currelem.GetBCDofFlag()[irowq])*detb*VelAdjOld_vec[idim]->_val_dofs[i]; //Dirichlet bc } for (uint idim=0; idim_val_g[0]*dphiidx_g[idim]; //TODO can put it outside for (uint idim=0; idim_grad_g[0][idim] //Adjoint of Advection 1 delta(u) DOT grad(u): adj of nonlinear stuff has 2 TERMS (well, not always) + phij_g*Advphii_g //Adjoint of Advection 2 u DOT grad (delta(u)): adj of nonlinear stuff has 2 TERMS ); // block +1 [2-6-7] int idimp1=(idim+1)%space_dim; - currelem.Mat()(irowq,j+idimp1*VelAdjOld._ndof) + currelem.Mat()(irowq,j+idimp1*VelAdjOldX._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( + IRe*(dphijdx_g[idim]*dphiidx_g[idimp1]) + phij_g*phii_g*/*dveldx_g*/Vel_vec[idimp1]->_grad_g[0][idim] @@ -305,7 +308,7 @@ for (uint fe = 0; fe < QL; fe++) { #if (DIMENSION==3) // block +2 [3-4-8] int idimp2=(idim+2)%space_dim; - currelem.Mat()(irowq,j+idimp2*VelAdjOld._ndof) + currelem.Mat()(irowq,j+idimp2*VelAdjOldX._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( + IRe*(dphijdx_g[idim]*dphiidx_g[idimp2]) + phij_g*phii_g*/*dveldx_g*/Vel_vec[idimp2]->_grad_g[0][idim] @@ -318,9 +321,9 @@ for (uint fe = 0; fe < QL; fe++) { for (uint j=0; j VelAdjOld_vec; + VelAdjOld_vec.push_back(&VelAdjOldX); + VelAdjOld_vec.push_back(&VelAdjOldY); + VelAdjOld_vec.push_back(&VelAdjOldZ); + CurrentQuantity PressAdjOld(currgp); - PressAdjOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYONE]; + PressAdjOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_PressureAdj"); PressAdjOld.VectWithQtyFillBasic(); PressAdjOld.Allocate(); //========= END INTERNAL QUANTITIES (unknowns of the equation) ================= @@ -416,11 +432,10 @@ for (uint fe = 0; fe < QL; fe++) { currelem.SetElDofsBc(); - VelAdjOld.GetElemDofs(); PressAdjOld.GetElemDofs(); //============ BC ======= - int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(VelAdjOld._ndof,space_dim,PressAdjOld); + int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(VelAdjOldX._ndof,space_dim,PressAdjOld); //========END BC============ //============================================================== @@ -435,23 +450,23 @@ for (uint fe = 0; fe < QL; fe++) { currgp.SetDPhiDxezetaElDofsFEVB_g (fe,qp); } - const double det = dt * currgp.JacVectBB_g(xyz); + const double det = currgp.JacVectBB_g(xyz); const double dtxJxW_g = det * ml_prob.GetQrule(currelem.GetDim()).GetGaussWeight(qp); //=======end "COMMON SHAPE PART"=================================== xyz_refbox.val_g(); - PressAdjOld._qtyptr->Function_txyz(time,&xyz_refbox._val_g[0]/*xyz._val_g*/,&PressAdjOld._val_g[0]); //i prefer using the function instead of the p_old vector + PressAdjOld._qtyptr->Function_txyz(0.,&xyz_refbox._val_g[0]/*xyz._val_g*/,&PressAdjOld._val_g[0]); //i prefer using the function instead of the p_old vector //============================================================== //========= FILLING ELEMENT MAT/RHS (i loop) ==================== //============================================================== - for (uint i=0; i < VelAdjOld._ndof; i++) { + for (uint i=0; i < VelAdjOldX._ndof; i++) { - const double phii_g = currgp._phi_ndsQLVB_g[VelAdjOld._FEord][i]; + const double phii_g = currgp._phi_ndsQLVB_g[VelAdjOldX._FEord][i]; for (uint idim=0; idim< space_dim; idim++) { - uint irowq=i+idim*VelAdjOld._ndof; + uint irowq=i+idim*VelAdjOldX._ndof; currelem.Rhs()(irowq) += currelem.GetBCDofFlag()[irowq]* dtxJxW_g*( -1.*press_fl*PressAdjOld._val_g[0]*currgp.get_normal_ptr()[idim]*phii_g diff --git a/applications/OptimalControl/mhdopt/OptQuantities.cpp b/applications/OptimalControl/mhdopt/OptQuantities.cpp index 923fcf6ed..d691c2759 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.cpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.cpp @@ -117,15 +117,27 @@ VelocityZ::VelocityZ(std::string name_in, QuantityMap& qtymap_in, uint dim_in, u } //========================================================================= -VelocityAdj::VelocityAdj(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) +VelocityAdjX::VelocityAdjX(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) : Quantity(name_in,qtymap_in,dim_in,FEord_in) { - for (uint i=0;i -bdry_toll && x_rotshift[2] < bdry_toll ) { //current -void VelocityAdj::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { +void VelocityAdjX::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { const double bdry_toll = DEFAULT_BDRY_TOLL; @@ -1293,75 +1312,143 @@ Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); - -#if (DIMENSION==2) + if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { //left of the RefBox + bc_flag[0]=0; + } + + if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll) { //right of the RefBox + bc_flag[0]=0; + } - if ( (x_rotshift[0]) > -bdry_toll && ( x_rotshift[0]) < bdry_toll ) {//left of the RefBox + if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll) { //bottom of the RefBox bc_flag[0]=0; - bc_flag[1]=0; } - if ( (le[0]-lb[0]) -(x_rotshift[0]) > -bdry_toll && (le[0]-lb[0]) -(x_rotshift[0]) < bdry_toll){ //right of the RefBox - bc_flag[0]=0; - bc_flag[1]=0; + if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { //top of the of the RefBox + bc_flag[0]=0; + } + + if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n + } + + if ((le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll) { + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n } - if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { //bottom of the RefBox - bc_flag[0]=0; -// bc_flag[1]=0; //comment it, because you leave u_y free + return; + +} + + + + +void VelocityAdjY::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { + + const double bdry_toll = DEFAULT_BDRY_TOLL; + +Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + + std::vector lb(_qtymap.GetMeshTwo()->get_dim()); + std::vector le(_qtymap.GetMeshTwo()->get_dim()); + lb[0] = box->_lb[0]; //already nondimensionalized + le[0] = box->_le[0]; + lb[1] = box->_lb[1]; + le[1] = box->_le[1]; + if (_qtymap.GetMeshTwo()->get_dim() == 3) { + lb[2] = box->_lb[2]; + le[2] = box->_le[2]; } - if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { //top of the of the RefBox + std::vector x_rotshift(_qtymap.GetMeshTwo()->get_dim()); + _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); + + + if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { //left of the RefBox bc_flag[0]=0; -// bc_flag[1]=0; //comment it, because you leave u_y free } -#else + if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll) { //right of the RefBox + bc_flag[0]=0; + } + + if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll) { //bottom of the RefBox +// bc_flag[0]=0; //INSTEAD THIS MUST CORRESPOND TO THE DIRECT + //the SPACE of ADJOINT functions is the same as the SPACE for the DIRECT test functions + //if you fix this then you dont control... + } + + if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { //top of the of the RefBox +// bc_flag[0]=0; //INSTEAD THIS MUST CORRESPOND TO THE DIRECT + } + + if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n //leave this free for 2D + } + + if ((le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll) { + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n //leave this free for 2D + } + + + return; + +} + + + + + +void VelocityAdjZ::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { + + const double bdry_toll = DEFAULT_BDRY_TOLL; + +Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + + std::vector lb(_qtymap.GetMeshTwo()->get_dim()); + std::vector le(_qtymap.GetMeshTwo()->get_dim()); + lb[0] = box->_lb[0]; //already nondimensionalized + le[0] = box->_le[0]; + lb[1] = box->_lb[1]; + le[1] = box->_le[1]; + if (_qtymap.GetMeshTwo()->get_dim() == 3) { + lb[2] = box->_lb[2]; + le[2] = box->_le[2]; + } + + std::vector x_rotshift(_qtymap.GetMeshTwo()->get_dim()); + _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); + if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { //left of the RefBox bc_flag[0]=0; - bc_flag[1]=0; - bc_flag[2]=0; } if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll){ //right of the RefBox bc_flag[0]=0; - bc_flag[1]=0; - bc_flag[2]=0; } if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll) { //bottom of the RefBox bc_flag[0]=0; -// bc_flag[1]=0; //INSTEAD THIS MUST CORRESPOND TO THE DIRECT - //the SPACE of ADJOINT functions is the same as the SPACE for the DIRECT test functions - //if you fix this then you dont control... - bc_flag[2]=0; } if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { //top of the of the RefBox bc_flag[0]=0; -// bc_flag[1]=0; //INSTEAD THIS MUST CORRESPOND TO THE DIRECT - bc_flag[2]=0; } if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { - if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n - if (bc_flag[1] == 1) bc_flag[1] = _qtymap.GetInputParser()->get("Fake3D"); //u x n //leave this free for 2D - bc_flag[2]=0; //u dot n + bc_flag[0]=0; //u dot n } if ((le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll) { - if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //u x n - if (bc_flag[1] == 1) bc_flag[1] = _qtymap.GetInputParser()->get("Fake3D"); //u x n //leave this free for 2D - bc_flag[2]=0; //u dot n + bc_flag[0]=0; //u dot n } -#endif - + + return; -} - - - +} + + void PressureAdj::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { @@ -1728,13 +1815,24 @@ void MagnFieldHomLagMult::initialize_xyz(const double* xp, std::vector< double > return; } -void VelocityAdj::initialize_xyz(const double* xp, std::vector< double >& value) const { +void VelocityAdjX::initialize_xyz(const double* xp, std::vector< double >& value) const { + + value[0] = 0.; + + return; +} + + +void VelocityAdjY::initialize_xyz(const double* xp, std::vector< double >& value) const { + + value[0] = 0.; + + return; +} + +void VelocityAdjZ::initialize_xyz(const double* xp, std::vector< double >& value) const { value[0] = 0.; - value[1] = 0.; -#if (DIMENSION==3) - value[2] = 0.; -#endif return; } diff --git a/applications/OptimalControl/mhdopt/OptQuantities.hpp b/applications/OptimalControl/mhdopt/OptQuantities.hpp index daa718eae..449b49ff3 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.hpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.hpp @@ -171,12 +171,39 @@ class VelocityZ : public Quantity { -class VelocityAdj : public Quantity { +class VelocityAdjX : public Quantity { public: - VelocityAdj(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~VelocityAdj(){}; + VelocityAdjX(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; + void initialize_xyz(const double* xp, std::vector & value) const; + + +}; + + +class VelocityAdjY : public Quantity { + + public: + + VelocityAdjY(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; + void initialize_xyz(const double* xp, std::vector & value) const; + + +}; + + +class VelocityAdjZ : public Quantity { + + public: + + VelocityAdjZ(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; diff --git a/applications/OptimalControl/mhdopt/input/femus_conf.in b/applications/OptimalControl/mhdopt/input/femus_conf.in index a16338c19..2e24465bb 100644 --- a/applications/OptimalControl/mhdopt/input/femus_conf.in +++ b/applications/OptimalControl/mhdopt/input/femus_conf.in @@ -117,9 +117,5 @@ Fake3D 0 # ----------------------------------------------------------------------- # PseudoTimeStepping NonStatNS 0 # 1 -NonStatMHD 0 # 1 -NonStatNSAD 0 -NonStatMHDAD 0 -NonStatMHDCONT 0 \ No newline at end of file diff --git a/applications/OptimalControl/mhdopt/main.cpp b/applications/OptimalControl/mhdopt/main.cpp index 670e86e4c..03cffc6d8 100644 --- a/applications/OptimalControl/mhdopt/main.cpp +++ b/applications/OptimalControl/mhdopt/main.cpp @@ -118,16 +118,20 @@ int main(int argc, char** argv) { VelocityY velocityY("Qty_Velocity1",qty_map,1,QQ); qty_map.AddQuantity(&velocityY); VelocityZ velocityZ("Qty_Velocity2",qty_map,1,QQ); qty_map.AddQuantity(&velocityZ); - VelocityAdj velocity_adj("Qty_VelocityAdj",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&velocity_adj); + VelocityAdjX velocity_adjX("Qty_VelocityAdj0",qty_map,1,QQ); qty_map.AddQuantity(&velocity_adjX); + VelocityAdjY velocity_adjY("Qty_VelocityAdj1",qty_map,1,QQ); qty_map.AddQuantity(&velocity_adjY); + VelocityAdjZ velocity_adjZ("Qty_VelocityAdj2",qty_map,1,QQ); qty_map.AddQuantity(&velocity_adjZ); + + MagnFieldHom bhom("Qty_MagnFieldHom",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom); MagnFieldExt Bext("Qty_MagnFieldExt",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&Bext); MagnFieldHomAdj bhom_adj("Qty_MagnFieldHomAdj",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom_adj); - MagnFieldHomLagMult bhom_lag_mult("Qty_MagnFieldHomLagMult",qty_map,1,LL); qty_map.AddQuantity(&bhom_lag_mult); - MagnFieldExtLagMult Bext_lag_mult("Qty_MagnFieldExtLagMult",qty_map,1,LL); qty_map.AddQuantity(&Bext_lag_mult); - MagnFieldHomLagMultAdj bhom_lag_mult_adj("Qty_MagnFieldHomLagMultAdj",qty_map,1,LL); qty_map.AddQuantity(&bhom_lag_mult_adj); - Pressure pressure("Qty_Pressure",qty_map,1,LL); qty_map.AddQuantity(&pressure); - PressureAdj pressure_adj("Qty_PressureAdj",qty_map,1,LL); qty_map.AddQuantity(&pressure_adj); + MagnFieldHomLagMult bhom_lag_mult("Qty_MagnFieldHomLagMult",qty_map,1,LL); qty_map.AddQuantity(&bhom_lag_mult); + MagnFieldExtLagMult Bext_lag_mult("Qty_MagnFieldExtLagMult",qty_map,1,LL); qty_map.AddQuantity(&Bext_lag_mult); + MagnFieldHomLagMultAdj bhom_lag_mult_adj("Qty_MagnFieldHomLagMultAdj",qty_map,1,LL); qty_map.AddQuantity(&bhom_lag_mult_adj); + Pressure pressure("Qty_Pressure",qty_map,1,LL); qty_map.AddQuantity(&pressure); + PressureAdj pressure_adj("Qty_PressureAdj",qty_map,1,LL); qty_map.AddQuantity(&pressure_adj); DesVelocityX des_velocityX("Qty_DesVelocity0",qty_map,1,QQ); qty_map.AddQuantity(&des_velocityX); DesVelocityY des_velocityY("Qty_DesVelocity1",qty_map,1,QQ); qty_map.AddQuantity(&des_velocityY); @@ -205,7 +209,9 @@ int main(int argc, char** argv) { eqnNSAD.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_VelocityAdj"); eqnNSAD.AddSolutionToSystemPDE("Qty_PressureAdj"); - eqnNSAD.AddUnknownToSystemPDE(&velocity_adj); + eqnNSAD.AddUnknownToSystemPDE(&velocity_adjX); + eqnNSAD.AddUnknownToSystemPDE(&velocity_adjY); + eqnNSAD.AddUnknownToSystemPDE(&velocity_adjZ); eqnNSAD.AddUnknownToSystemPDE(&pressure_adj); eqnNSAD.SetAssembleFunction(GenMatRhsNSAD); From 2396aa98f54e84d5d188c62492a0c9b627a6ba7e Mon Sep 17 00:00:00 2001 From: Giorgio Bornia Date: Wed, 8 Apr 2015 20:01:45 -0500 Subject: [PATCH 16/19] MagnFieldHomAdj with scalar components in mhdopt --- applications/OptimalControl/mhdopt/EqnMHD.cpp | 12 +- .../OptimalControl/mhdopt/EqnMHDAD.cpp | 115 +++++++----- .../OptimalControl/mhdopt/EqnMHDCONT.cpp | 49 +++-- .../OptimalControl/mhdopt/EqnNSAD.cpp | 55 ++++-- .../OptimalControl/mhdopt/OptQuantities.cpp | 173 +++++++++++++----- .../OptimalControl/mhdopt/OptQuantities.hpp | 38 +++- applications/OptimalControl/mhdopt/main.cpp | 8 +- src/equations/CurrentQuantity.cpp | 30 ++- src/equations/CurrentQuantity.hpp | 12 +- 9 files changed, 345 insertions(+), 147 deletions(-) diff --git a/applications/OptimalControl/mhdopt/EqnMHD.cpp b/applications/OptimalControl/mhdopt/EqnMHD.cpp index f17b0abe2..6f2b059c3 100644 --- a/applications/OptimalControl/mhdopt/EqnMHD.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHD.cpp @@ -47,8 +47,6 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr double LapBe_g[DIMENSION]; //============================ - const double time = 0.; //ml_prob._timeloop._curr_time; - my_system._LinSolver[Level]->_KK->zero(); my_system._LinSolver[Level]->_RESC->zero(); @@ -180,13 +178,13 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr #if BMAG_QTY==1 if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); - else Bext._qtyptr->FunctionDof(Bext,time,&xyz_refbox._val_dofs[0]); + else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); #endif #if VELOCITY_QTY==1 //----- for Advection MAT & RHS for (uint idim=0; idim < space_dim; idim++) { if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); - else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],time,&xyz_refbox._val_dofs[0]); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); } #endif @@ -497,12 +495,12 @@ for (uint fe = 0; fe < QL; fe++) { //========== EXTERNAL DOFS === #if BMAG_QTY==1 if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); - else Bext._qtyptr->FunctionDof(Bext,time,&xyz_refbox._val_dofs[0]); + else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); #endif #if VELOCITY_QTY==1 for (uint idim=0; idim < space_dim; idim++) { if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); - else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],time,&xyz_refbox._val_dofs[0]); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); } #endif @@ -524,7 +522,7 @@ for (uint fe = 0; fe < QL; fe++) { //---------lagmult //"post gauss method" xyz_refbox.val_g(); // val_g(vb,xyz); //CHECK the QUADRATICS!!!!!!!!! - LagMultOld._qtyptr->Function_txyz(time,&xyz_refbox._val_g[0],&LagMultOld._val_g[0]); //check that you have ZERO here + LagMultOld._qtyptr->Function_txyz(0.,&xyz_refbox._val_g[0],&LagMultOld._val_g[0]); //check that you have ZERO here #if VELOCITY_QTY==1 for (uint idim=0; idim < space_dim; idim++) { diff --git a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp index ec5483a90..406cd9152 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp @@ -66,15 +66,28 @@ using namespace femus; CurrentGaussPointBase & currgp = CurrentGaussPointBase::build(currelem,ml_prob.GetQrule(currelem.GetDim())); //=========INTERNAL QUANTITIES (unknowns of the equation) ================== - //QTYZERO - CurrentQuantity BhomAdjOld(currgp); - BhomAdjOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYZERO]; - BhomAdjOld.VectWithQtyFillBasic(); - BhomAdjOld.Allocate(); - - //QTYONE + CurrentQuantity BhomAdjOldX(currgp); + BhomAdjOldX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomAdj0"); + BhomAdjOldX.VectWithQtyFillBasic(); + BhomAdjOldX.Allocate(); + + CurrentQuantity BhomAdjOldY(currgp); + BhomAdjOldY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomAdj1"); + BhomAdjOldY.VectWithQtyFillBasic(); + BhomAdjOldY.Allocate(); + + CurrentQuantity BhomAdjOldZ(currgp); + BhomAdjOldZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomAdj2"); + BhomAdjOldZ.VectWithQtyFillBasic(); + BhomAdjOldZ.Allocate(); + + std::vector BhomAdjOld_vec; + BhomAdjOld_vec.push_back(&BhomAdjOldX); + BhomAdjOld_vec.push_back(&BhomAdjOldY); + BhomAdjOld_vec.push_back(&BhomAdjOldZ); + CurrentQuantity BhomLagMultAdjOld(currgp); - BhomLagMultAdjOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYONE]; + BhomLagMultAdjOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomLagMultAdj"); BhomLagMultAdjOld.VectWithQtyFillBasic(); BhomLagMultAdjOld.Allocate(); //========= END INTERNAL QUANTITIES (unknowns of the equation) ================= @@ -172,10 +185,11 @@ using namespace femus; currelem.SetElDofsBc(); - BhomAdjOld.GetElemDofs(); BhomLagMultAdjOld.GetElemDofs(); for (uint idim=0; idim < space_dim; idim++) { + BhomAdjOld_vec[idim]->GetElemDofs(); + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); if ( VelAdj_vec[idim]->_eqnptr != NULL) VelAdj_vec[idim]->GetElemDofs(); @@ -218,13 +232,14 @@ for (uint fe = 0; fe < QL; fe++) { } //=======end of the "COMMON SHAPE PART"================== - BhomAdjOld.val_g(); + Bmag.curl_g(); Bmag.val_g(); for (uint idim=0; idimval_g(); - VelAdj_vec[idim]->val_g(); + BhomAdjOld_vec[idim]->val_g(); + Vel_vec[idim]->val_g(); + VelAdj_vec[idim]->val_g(); VelAdj_vec_val_g[idim] = VelAdj_vec[idim]->_val_g[0]; } @@ -236,33 +251,33 @@ for (uint fe = 0; fe < QL; fe++) { //========= FILLING ELEMENT MAT/RHS (i loop) ==================== //============================================================== - for (uint i=0; i < BhomAdjOld._ndof; i++) { + for (uint i=0; i < BhomAdjOldX._ndof; i++) { //======="COMMON tEST PART for QTYZERO": func and derivative, of the QTYZERO FE ORD ========== - const double phii_g = currgp._phi_ndsQLVB_g[BhomAdjOld._FEord][i]; - for (uint idim=0; idim_val_dofs[i]; //Dirichlet bc } for (uint idim=0; idim_val_g[0]*dphijdx_g[idim]; for (uint idim=0; idim_val_g[0] ) @@ -288,7 +303,7 @@ for (uint fe = 0; fe < QL; fe++) { #if (DIMENSION==3) // block +2 [3-4-8] int idimp2=(idim+2)%space_dim; - currelem.Mat()(irowq,j+idimp2*BhomAdjOld._ndof) + currelem.Mat()(irowq,j+idimp2*BhomAdjOldX._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( + (1-LAP_MHD)*IRem*(-dphijdx_g[idim]* dphiidx_g[idimp2] ) - phii_g*( -dphijdx_g[idim]*Vel_vec[idimp2]->_val_g[0] ) @@ -301,9 +316,9 @@ for (uint fe = 0; fe < QL; fe++) { for (uint j=0; j < BhomLagMultAdjOld._ndof; j++) {// B^T element matrix ( p*div(v) ) const double psij_g = currgp._phi_ndsQLVB_g[BhomLagMultAdjOld._FEord][j]; - const int jclml= j + space_dim*BhomAdjOld._ndof; + const int jclml= j + space_dim*BhomAdjOldX._ndof; for (uint idim=0; idim BhomAdjOld_vec; + BhomAdjOld_vec.push_back(&BhomAdjOldX); + BhomAdjOld_vec.push_back(&BhomAdjOldY); + BhomAdjOld_vec.push_back(&BhomAdjOldZ); + CurrentQuantity BhomLagMultAdjOld(currgp); - BhomLagMultAdjOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYONE]; + BhomLagMultAdjOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomLagMultAdj"); BhomLagMultAdjOld.VectWithQtyFillBasic(); BhomLagMultAdjOld.Allocate(); //========= END INTERNAL QUANTITIES (unknowns of the equation) ================= @@ -401,11 +429,10 @@ for (uint fe = 0; fe < QL; fe++) { currelem.SetElDofsBc(); - BhomAdjOld.GetElemDofs(); BhomLagMultAdjOld.GetElemDofs(); //============ BC ======= - int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(BhomAdjOld._ndof,space_dim,BhomLagMultAdjOld); + int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(BhomAdjOldX._ndof,space_dim,BhomLagMultAdjOld); //========END BC============ const uint el_ngauss = ml_prob.GetQrule(currelem.GetDim()).GetGaussPointsNumber(); @@ -427,12 +454,12 @@ for (uint fe = 0; fe < QL; fe++) { //============================================================== //========= FILLING ELEMENT MAT/RHS (i loop) =================== //============================================================== - for (uint i=0; i < BhomAdjOld._ndof; i++) { + for (uint i=0; i < BhomAdjOldX._ndof; i++) { - const double phii_g = currgp._phi_ndsQLVB_g[BhomAdjOld._FEord][i]; + const double phii_g = currgp._phi_ndsQLVB_g[BhomAdjOldX._FEord][i]; for (uint idim=0; idim< space_dim; idim++) { - uint irowq=i+idim*BhomAdjOld._ndof; + uint irowq=i+idim*BhomAdjOldX._ndof; currelem.Rhs()(irowq) += currelem.GetBCDofFlag()[irowq]* dtxJxW_g*( -1.*press_fl*BhomLagMultAdjOld._val_g[0]*currgp.get_normal_ptr()[idim]*phii_g diff --git a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp index 846e20c36..f069b96aa 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp @@ -155,10 +155,32 @@ using namespace femus; Bhom.Allocate(); //=============== - CurrentQuantity BhomAdj(currgp); - BhomAdj._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomAdj"); - BhomAdj.VectWithQtyFillBasic(); - BhomAdj.Allocate(); +//=============== + CurrentQuantity BhomAdjX(currgp); + BhomAdjX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomAdj0"); + BhomAdjX.VectWithQtyFillBasic(); + BhomAdjX.Allocate(); + + CurrentQuantity BhomAdjY(currgp); + BhomAdjY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomAdj1"); + BhomAdjY.VectWithQtyFillBasic(); + BhomAdjY.Allocate(); + + CurrentQuantity BhomAdjZ(currgp); + BhomAdjZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomAdj2"); + BhomAdjZ.VectWithQtyFillBasic(); + BhomAdjZ.Allocate(); + + std::vector BhomAdj_vec; + BhomAdj_vec.push_back(&BhomAdjX); + BhomAdj_vec.push_back(&BhomAdjY); + BhomAdj_vec.push_back(&BhomAdjZ); + + CurrentQuantity BhomAdj_vecQuant(currgp); //without quantity, nor equation + BhomAdj_vecQuant._dim = BhomAdj_vec.size(); + BhomAdj_vecQuant._FEord = BhomAdj_vec[0]->_FEord; + BhomAdj_vecQuant._ndof = BhomAdj_vec[0]->_ndof; + BhomAdj_vecQuant.Allocate(); //=========END EXTERNAL QUANTITIES (couplings) ===== @@ -182,13 +204,14 @@ using namespace femus; else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); if ( VelAdj_vec[idim]->_eqnptr != NULL) VelAdj_vec[idim]->GetElemDofs(); else VelAdj_vec[idim]->_qtyptr->FunctionDof(*VelAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); + if ( BhomAdj_vec[idim]->_eqnptr != NULL ) BhomAdj_vec[idim]->GetElemDofs(); + else BhomAdj_vec[idim]->_qtyptr->FunctionDof(*BhomAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); } if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); else Bhom._qtyptr->FunctionDof(Bhom,0.,&xyz_refbox._val_dofs[0]); - if ( BhomAdj._eqnptr != NULL ) BhomAdj.GetElemDofs(); - else BhomAdj._qtyptr->FunctionDof(BhomAdj,0.,&xyz_refbox._val_dofs[0]); + BhomAdj_vecQuant.GetElemDofs(BhomAdj_vec); //============================================================== //================== GAUSS LOOP (qp loop) ====================== @@ -214,24 +237,24 @@ for (uint fe = 0; fe < QL; fe++) { //======= end of the "COMMON SHAPE PART"================== //========preparation for things that are independent of (i,j), dofs of test and shape ===================== - BhomAdj.curl_g(); + BhomAdj_vecQuant.curl_g(); Bhom.curl_g(); BeOld.val_g(); Bhom.val_g(); - BhomAdj.grad_g(); - for (uint idim=0; idimgrad_g(); Vel_vec[idim]->val_g(); VelAdj_vec[idim]->val_g(); Vel_vec_val_g[idim] = Vel_vec[idim]->_val_g[0]; VelAdj_vec_val_g[idim] = VelAdj_vec[idim]->_val_g[0]; - } + } // vector product Math::extend( &Vel_vec_val_g[0], &Vel_vec_val_g3D[0],space_dim); Math::extend(&VelAdj_vec_val_g[0],&VelAdj_vec_val_g3D[0],space_dim); - Math::cross(&BhomAdj._curl_g3D[0], &Vel_vec_val_g3D[0],curlxiXvel_g3D ); + Math::cross(&BhomAdj_vecQuant._curl_g3D[0], &Vel_vec_val_g3D[0],curlxiXvel_g3D ); Math::cross( &Bhom._curl_g3D[0],&VelAdj_vec_val_g3D[0],curlbXlambda_g3D ); //========end preparation for things that are independent of (i,j) dofs of test and shape ===================== @@ -252,7 +275,7 @@ for (uint fe = 0; fe < QL; fe++) { for (uint idim=0; idim_grad_g[0][jdim]*dphiidx_g[jdim]; //TODO CHECK THIS } } //============end preparation for (i) ============ diff --git a/applications/OptimalControl/mhdopt/EqnNSAD.cpp b/applications/OptimalControl/mhdopt/EqnNSAD.cpp index b31681827..033ef7df2 100644 --- a/applications/OptimalControl/mhdopt/EqnNSAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnNSAD.cpp @@ -171,12 +171,32 @@ using namespace femus; Bmag.Allocate(); //=============== - CurrentQuantity BhomAdj(currgp); - BhomAdj._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomAdj"); - BhomAdj.VectWithQtyFillBasic(); - BhomAdj.Allocate(); + CurrentQuantity BhomAdjX(currgp); + BhomAdjX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomAdj0"); + BhomAdjX.VectWithQtyFillBasic(); + BhomAdjX.Allocate(); - //========= END EXTERNAL QUANTITIES ================= + CurrentQuantity BhomAdjY(currgp); + BhomAdjY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomAdj1"); + BhomAdjY.VectWithQtyFillBasic(); + BhomAdjY.Allocate(); + + CurrentQuantity BhomAdjZ(currgp); + BhomAdjZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomAdj2"); + BhomAdjZ.VectWithQtyFillBasic(); + BhomAdjZ.Allocate(); + + std::vector BhomAdj_vec; + BhomAdj_vec.push_back(&BhomAdjX); + BhomAdj_vec.push_back(&BhomAdjY); + BhomAdj_vec.push_back(&BhomAdjZ); + + CurrentQuantity BhomAdj_vecQuant(currgp); //without quantity, nor equation + BhomAdj_vecQuant._dim = BhomAdj_vec.size(); + BhomAdj_vecQuant._FEord = BhomAdj_vec[0]->_FEord; + BhomAdj_vecQuant._ndof = BhomAdj_vec[0]->_ndof; + BhomAdj_vecQuant.Allocate(); +//========= END EXTERNAL QUANTITIES ================= currelem.Mat().zero(); @@ -190,22 +210,27 @@ using namespace femus; currelem.SetElDofsBc(); - PressAdjOld.GetElemDofs(); if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); else Bhom._qtyptr->FunctionDof(Bhom,0.,&xyz_refbox._val_dofs[0]); if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); - if ( BhomAdj._eqnptr != NULL ) BhomAdj.GetElemDofs(); - else BhomAdj._qtyptr->FunctionDof(BhomAdj,0.,&xyz_refbox._val_dofs[0]); for (uint idim=0; idim < space_dim; idim++) { VelAdjOld_vec[idim]->GetElemDofs(); - if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); - else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); //give the Hartmann flow, if not solving NS - if ( VelDes_vec[idim]->_eqnptr != NULL ) VelDes_vec[idim]->GetElemDofs(); - else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],0.,&xyz_refbox._val_dofs[0]); + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); //give the Hartmann flow, if not solving NS + if ( VelDes_vec[idim]->_eqnptr != NULL ) VelDes_vec[idim]->GetElemDofs(); + else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],0.,&xyz_refbox._val_dofs[0]); + if ( BhomAdj_vec[idim]->_eqnptr != NULL ) BhomAdj_vec[idim]->GetElemDofs(); + else BhomAdj_vec[idim]->_qtyptr->FunctionDof(*BhomAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); + } + + + BhomAdj_vecQuant.GetElemDofs(BhomAdj_vec); + PressAdjOld.GetElemDofs(); + //======SUM Bhom and Bext //from now on, you'll only use Bmag //Bmag,Bext and Bhom must have the same orders! Math::zeroN(&Bmag._val_dofs[0],Bmag._dim*Bmag._ndof); @@ -244,8 +269,8 @@ for (uint fe = 0; fe < QL; fe++) { } //=======end of the "COMMON SHAPE PART"================== - BhomAdj.curl_g(); - Bmag.val_g(); + BhomAdj_vecQuant.curl_g(); + Bmag.val_g(); for (uint idim=0; idim < space_dim; idim++) { VelAdjOld_vec[idim]->val_g(); @@ -256,7 +281,7 @@ for (uint fe = 0; fe < QL; fe++) { //vector product Math::extend(&Bmag._val_g[0],&Bmag._val_g3D[0],space_dim); - Math::cross(&BhomAdj._curl_g3D[0],&Bmag._val_g3D[0],curlxiXB_g3D); + Math::cross(&BhomAdj_vecQuant._curl_g3D[0],&Bmag._val_g3D[0],curlxiXB_g3D); //============================================================== //========= FILLING ELEMENT MAT/RHS (i loop) ==================== diff --git a/applications/OptimalControl/mhdopt/OptQuantities.cpp b/applications/OptimalControl/mhdopt/OptQuantities.cpp index d691c2759..0ed9e6b15 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.cpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.cpp @@ -26,7 +26,21 @@ MagnFieldHom::MagnFieldHom(std::string name_in, QuantityMap& qtymap_in, uint dim } //=========================================================================== -MagnFieldHomAdj::MagnFieldHomAdj(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) +MagnFieldHomAdjX::MagnFieldHomAdjX(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) +: Quantity(name_in,qtymap_in,dim_in,FEord_in) { + + for (uint i=0;i(_qtymap.GetMeshTwo()->GetDomain()); -void MagnFieldHomAdj::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { +void MagnFieldHomAdjX::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { const double bdry_toll = DEFAULT_BDRY_TOLL; @@ -1073,74 +1094,136 @@ Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); - #if (DIMENSION==2) - if ( (x_rotshift[0]) > -bdry_toll && ( x_rotshift[0]) < bdry_toll ) {//left of the RefBox - bc_flag[0]=0; - bc_flag[1]=0; + bc_flag[0]=0; } if ( (le[0]-lb[0]) -(x_rotshift[0]) > -bdry_toll && (le[0]-lb[0]) -(x_rotshift[0]) < bdry_toll){ //right of the RefBox - bc_flag[0]=0; - bc_flag[1]=0; + bc_flag[0]=0; } - if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { //bottom of the RefBox + if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { //bottom of the RefBox bc_flag[0]=0; -// bc_flag[1]=0; //u dot n leave this free } if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { //top of the of the RefBox - bc_flag[0]=0; -// bc_flag[1]=0; //u dot n leave this free + bc_flag[0]=0; } -#else +if ( x_rotshift[2] > -bdry_toll && x_rotshift[2] < bdry_toll ) { //current + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); + } + + if ((le[2]-lb[2]) - x_rotshift[2] > -bdry_toll && (le[2]-lb[2]) -x_rotshift[2] < bdry_toll) { + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); + } + + return; + +} + + +void MagnFieldHomAdjY::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { + + const double bdry_toll = DEFAULT_BDRY_TOLL; + +Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + + std::vector lb(_qtymap.GetMeshTwo()->get_dim()); + std::vector le(_qtymap.GetMeshTwo()->get_dim()); + lb[0] = box->_lb[0]; //already nondimensionalized + le[0] = box->_le[0]; + lb[1] = box->_lb[1]; + le[1] = box->_le[1]; + if (_qtymap.GetMeshTwo()->get_dim() == 3) { + lb[2] = box->_lb[2]; + le[2] = box->_le[2]; + } + + std::vector x_rotshift(_qtymap.GetMeshTwo()->get_dim()); + _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); + if ( (x_rotshift[0]) > -bdry_toll && ( x_rotshift[0]) < bdry_toll ) {//left of the RefBox bc_flag[0]=0; - bc_flag[1]=0; - bc_flag[2]=0; } if ( (le[0]-lb[0]) -(x_rotshift[0]) > -bdry_toll && (le[0]-lb[0]) -(x_rotshift[0]) < bdry_toll){ //right of the RefBox bc_flag[0]=0; - bc_flag[1]=0; - bc_flag[2]=0; } if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { //bottom of the RefBox - bc_flag[0]=0; -// bc_flag[1]=0; //u dot n - bc_flag[2]=0; +// bc_flag[0]=0; //u dot n } if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { //top of the of the RefBox - bc_flag[0]=0; -// bc_flag[1]=0; //u dot n - bc_flag[2]=0; +// bc_flag[0]=0; //u dot n } if ( x_rotshift[2] > -bdry_toll && x_rotshift[2] < bdry_toll ) { //current if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); - if (bc_flag[1] == 1) bc_flag[1] = _qtymap.GetInputParser()->get("Fake3D"); -// bc_flag[2]=0; } if ((le[2]-lb[2]) - x_rotshift[2] > -bdry_toll && (le[2]-lb[2]) -x_rotshift[2] < bdry_toll) { if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); - if (bc_flag[1] == 1) bc_flag[1] = _qtymap.GetInputParser()->get("Fake3D"); -// bc_flag[2]=0; } -#endif - + return; } + + +void MagnFieldHomAdjZ::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { + + const double bdry_toll = DEFAULT_BDRY_TOLL; + +Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + + std::vector lb(_qtymap.GetMeshTwo()->get_dim()); + std::vector le(_qtymap.GetMeshTwo()->get_dim()); + lb[0] = box->_lb[0]; //already nondimensionalized + le[0] = box->_le[0]; + lb[1] = box->_lb[1]; + le[1] = box->_le[1]; + if (_qtymap.GetMeshTwo()->get_dim() == 3) { + lb[2] = box->_lb[2]; + le[2] = box->_le[2]; + } + + std::vector x_rotshift(_qtymap.GetMeshTwo()->get_dim()); + _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); + + + if ( (x_rotshift[0]) > -bdry_toll && ( x_rotshift[0]) < bdry_toll ) {//left of the RefBox + bc_flag[0]=0; + } + + if ( (le[0]-lb[0]) -(x_rotshift[0]) > -bdry_toll && (le[0]-lb[0]) -(x_rotshift[0]) < bdry_toll){ //right of the RefBox + bc_flag[0]=0; + } + + if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { //bottom of the RefBox + bc_flag[0]=0; + } + + if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { //top of the of the RefBox + bc_flag[0]=0; + } + +if ( x_rotshift[2] > -bdry_toll && x_rotshift[2] < bdry_toll ) { //current +// bc_flag[0]=0; + } + + if ((le[2]-lb[2]) - x_rotshift[2] > -bdry_toll && (le[2]-lb[2]) -x_rotshift[2] < bdry_toll) { +// bc_flag[0]=0; + } + + return; - +} + void MagnFieldHomLagMult::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { @@ -1844,14 +1927,22 @@ void PressureAdj::initialize_xyz(const double* xp, std::vector< double >& value) return; } -void MagnFieldHomAdj::initialize_xyz(const double* xp, std::vector< double >& value) const { +void MagnFieldHomAdjX::initialize_xyz(const double* xp, std::vector< double >& value) const { value[0] = 0.; - value[1] = 0.; -#if (DIMENSION==3) - value[2] = 0.; -#endif + return; +} + + +void MagnFieldHomAdjY::initialize_xyz(const double* xp, std::vector< double >& value) const { + + value[0] = 0.; + return; +} + +void MagnFieldHomAdjZ::initialize_xyz(const double* xp, std::vector< double >& value) const { + value[0] = 0.; return; } diff --git a/applications/OptimalControl/mhdopt/OptQuantities.hpp b/applications/OptimalControl/mhdopt/OptQuantities.hpp index 449b49ff3..e3b1e60df 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.hpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.hpp @@ -18,7 +18,6 @@ class MagnFieldHom : public Quantity { public: MagnFieldHom(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~MagnFieldHom(){}; void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; @@ -27,12 +26,37 @@ class MagnFieldHom : public Quantity { }; -class MagnFieldHomAdj : public Quantity { +class MagnFieldHomAdjX : public Quantity { public: - MagnFieldHomAdj(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~MagnFieldHomAdj(){}; + MagnFieldHomAdjX(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; + void initialize_xyz(const double* xp, std::vector & value) const; + + +}; + +class MagnFieldHomAdjY : public Quantity { + + public: + + MagnFieldHomAdjY(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; + void initialize_xyz(const double* xp, std::vector & value) const; + + +}; + +class MagnFieldHomAdjZ : public Quantity { + + public: + + MagnFieldHomAdjZ(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; @@ -46,7 +70,6 @@ class MagnFieldExt : public Quantity { public: MagnFieldExt(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~MagnFieldExt(){}; void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; @@ -60,7 +83,6 @@ class MagnFieldHomLagMult : public Quantity { public: MagnFieldHomLagMult(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~MagnFieldHomLagMult(){}; void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; @@ -75,7 +97,6 @@ class MagnFieldHomLagMultAdj : public Quantity { public: MagnFieldHomLagMultAdj(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~MagnFieldHomLagMultAdj(){}; void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; @@ -90,7 +111,6 @@ class MagnFieldExtLagMult : public Quantity { public: MagnFieldExtLagMult(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~MagnFieldExtLagMult(){}; void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; @@ -105,7 +125,6 @@ class Pressure : public Quantity { public: Pressure(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~Pressure(){}; void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; @@ -120,7 +139,6 @@ class PressureAdj : public Quantity { public: PressureAdj(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); - ~PressureAdj(){}; void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; diff --git a/applications/OptimalControl/mhdopt/main.cpp b/applications/OptimalControl/mhdopt/main.cpp index 03cffc6d8..16a8a453a 100644 --- a/applications/OptimalControl/mhdopt/main.cpp +++ b/applications/OptimalControl/mhdopt/main.cpp @@ -122,10 +122,12 @@ int main(int argc, char** argv) { VelocityAdjY velocity_adjY("Qty_VelocityAdj1",qty_map,1,QQ); qty_map.AddQuantity(&velocity_adjY); VelocityAdjZ velocity_adjZ("Qty_VelocityAdj2",qty_map,1,QQ); qty_map.AddQuantity(&velocity_adjZ); + MagnFieldHomAdjX bhom_adjX("Qty_MagnFieldHomAdj0",qty_map,1,QQ); qty_map.AddQuantity(&bhom_adjX); + MagnFieldHomAdjY bhom_adjY("Qty_MagnFieldHomAdj1",qty_map,1,QQ); qty_map.AddQuantity(&bhom_adjY); + MagnFieldHomAdjZ bhom_adjZ("Qty_MagnFieldHomAdj2",qty_map,1,QQ); qty_map.AddQuantity(&bhom_adjZ); MagnFieldHom bhom("Qty_MagnFieldHom",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom); MagnFieldExt Bext("Qty_MagnFieldExt",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&Bext); - MagnFieldHomAdj bhom_adj("Qty_MagnFieldHomAdj",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom_adj); MagnFieldHomLagMult bhom_lag_mult("Qty_MagnFieldHomLagMult",qty_map,1,LL); qty_map.AddQuantity(&bhom_lag_mult); MagnFieldExtLagMult Bext_lag_mult("Qty_MagnFieldExtLagMult",qty_map,1,LL); qty_map.AddQuantity(&Bext_lag_mult); @@ -235,7 +237,9 @@ int main(int argc, char** argv) { eqnMHDAD.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHomAdj"); eqnMHDAD.AddSolutionToSystemPDE("Qty_MagnFieldHomLagMultAdj"); - eqnMHDAD.AddUnknownToSystemPDE(&bhom_adj); + eqnMHDAD.AddUnknownToSystemPDE(&bhom_adjX); + eqnMHDAD.AddUnknownToSystemPDE(&bhom_adjY); + eqnMHDAD.AddUnknownToSystemPDE(&bhom_adjZ); eqnMHDAD.AddUnknownToSystemPDE(&bhom_lag_mult_adj); eqnMHDAD.SetAssembleFunction(GenMatRhsMHDAD); diff --git a/src/equations/CurrentQuantity.cpp b/src/equations/CurrentQuantity.cpp index ed7ce9e85..ee0c5df90 100644 --- a/src/equations/CurrentQuantity.cpp +++ b/src/equations/CurrentQuantity.cpp @@ -19,12 +19,7 @@ namespace femus { CurrentQuantity::CurrentQuantity(const CurrentGaussPointBase & currgp_in) : _currGP(currgp_in),_currEl(currgp_in.GetCurrentElem()) { } - - - CurrentQuantity::~CurrentQuantity() { } - - - + //============================ //clearly, here we have the dphi at the dofs and the dof values //so, we have to extend both the dphi and the dofs @@ -34,7 +29,7 @@ namespace femus { //instead,the myVect._val_dofs3D is filled here //actually, that vector is only for service purposes //so it could be also translated into some temporary vector whenever needed - + /// @todo this function only works for a VECTOR quantity void CurrentQuantity::curl_g() { const uint ord = _FEord; @@ -282,12 +277,11 @@ void CurrentQuantity::GetElemDofs() { for (uint d = 0; d < _ndof; d++) { const uint indx = d + ivar * _ndof; - if (vect_ord < KK ) DofObj = _currEl.GetConn()[d]; - else if (vect_ord == KK) DofObj = _currEl.GetVolIel(); + DofObj = _currEl.GetConn()[d]; const uint dofkivar = _eqnptr->_dofmap.GetDofPosIn(Lev_pick_dof,DofObj + ivar*length_nodedof[vect_ord] + off_total); - if (vect_ord < KK ) { _val_dofs[indx] = ( *( _eqnptr->_LinSolver[Lev_pick_dof]->_EPSC ) )(dofkivar); } + _val_dofs[indx] = ( *( _eqnptr->_LinSolver[Lev_pick_dof]->_EPSC ) )(dofkivar); } } @@ -296,6 +290,22 @@ void CurrentQuantity::GetElemDofs() { } +//this function fills the element dofs from a vector of CurrentQuantity objects + void CurrentQuantity::GetElemDofs(const std::vector vec_in) { + + for (uint ivar=0; ivar < _dim; ivar++) { + for (uint d = 0; d < _ndof; d++) { + const uint indx = d + ivar * _ndof; + _val_dofs[indx] = vec_in[ivar]->_val_dofs[d]; + + } + } + + return; + } + + + // void CurrentQuantity::GetElemDofs_two() { // // unsigned SolType2 = ml_sol->GetSolutionType(ml_sol->GetIndex(_qtyptr->_name)); diff --git a/src/equations/CurrentQuantity.hpp b/src/equations/CurrentQuantity.hpp index c83462232..a556d8731 100644 --- a/src/equations/CurrentQuantity.hpp +++ b/src/equations/CurrentQuantity.hpp @@ -22,7 +22,6 @@ namespace femus { public: CurrentQuantity(const CurrentGaussPointBase &); - ~CurrentQuantity(); //TODO all these function are of the SET type (this is how I should call them), that is why they are NOT CONST @@ -34,6 +33,7 @@ namespace femus { void curl_g(); //this only needs the CUrrent GAUSS //No Quantity needed void ExtendDofs(); //this only needs the CUrrent GAUSS //No Quantity needed void GetElemDofs(); //this only needs the CUrrent ELEMENT + void GetElemDofs(const std::vector vec_in); void SetElemAverage(); //if you have NO Quantity and NO Equation ========== @@ -51,9 +51,6 @@ namespace femus { std::vector _el_average; - uint _FEord; - uint _dim; - uint _ndof; Quantity* _qtyptr; SystemTwo* _eqnptr; @@ -68,7 +65,12 @@ namespace femus { unsigned _indexSOL; unsigned _indSOL; unsigned _SolTypeSOL; - + +// once you set these three, you can call "Allocate" + uint _FEord; + uint _dim; + uint _ndof; +// once you set these three, you can call "Allocate" protected: From 713a7e9d45e7645ad3c33cdda5f2098bfe6baea4 Mon Sep 17 00:00:00 2001 From: Giorgio Bornia Date: Wed, 8 Apr 2015 21:51:09 -0500 Subject: [PATCH 17/19] MagnFieldHom with scalar components in mhdopt --- applications/OptimalControl/mhdopt/EqnMHD.cpp | 105 +++++---- .../OptimalControl/mhdopt/EqnMHDAD.cpp | 38 +++- .../OptimalControl/mhdopt/EqnMHDCONT.cpp | 57 +++-- applications/OptimalControl/mhdopt/EqnNS.cpp | 47 ++-- .../OptimalControl/mhdopt/EqnNSAD.cpp | 44 ++-- .../OptimalControl/mhdopt/OptQuantities.cpp | 204 ++++++++++++++---- .../OptimalControl/mhdopt/OptQuantities.hpp | 30 ++- applications/OptimalControl/mhdopt/main.cpp | 19 +- 8 files changed, 398 insertions(+), 146 deletions(-) diff --git a/applications/OptimalControl/mhdopt/EqnMHD.cpp b/applications/OptimalControl/mhdopt/EqnMHD.cpp index 6f2b059c3..47e7f4bc3 100644 --- a/applications/OptimalControl/mhdopt/EqnMHD.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHD.cpp @@ -71,13 +71,28 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr CurrentGaussPointBase & currgp = CurrentGaussPointBase::build(currelem,ml_prob.GetQrule(currelem.GetDim())); //=========INTERNAL QUANTITIES (unknowns of the equation) ================== - CurrentQuantity bhomOld(currgp); - bhomOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYZERO]; - bhomOld.VectWithQtyFillBasic(); - bhomOld.Allocate(); + CurrentQuantity BhomOldX(currgp); + BhomOldX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom0"); + BhomOldX.VectWithQtyFillBasic(); + BhomOldX.Allocate(); + + CurrentQuantity BhomOldY(currgp); + BhomOldY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom1"); + BhomOldY.VectWithQtyFillBasic(); + BhomOldY.Allocate(); + + CurrentQuantity BhomOldZ(currgp); + BhomOldZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom2"); + BhomOldZ.VectWithQtyFillBasic(); + BhomOldZ.Allocate(); + + std::vector BhomOld_vec; + BhomOld_vec.push_back(&BhomOldX); + BhomOld_vec.push_back(&BhomOldY); + BhomOld_vec.push_back(&BhomOldZ); CurrentQuantity LagMultOld(currgp); - LagMultOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYONE]; + LagMultOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomLagMult"); LagMultOld.VectWithQtyFillBasic(); LagMultOld.Allocate(); //========= END INTERNAL QUANTITIES (unknowns of the equation) ================= @@ -87,14 +102,14 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr //QTYZERO SHAPE: shape of the first Unknown CurrentQuantity Phij(currgp); //TODO this is another Vect that doesnt have an associated quantity still Phij._dim = 1; //scalar! - Phij._FEord = bhomOld._FEord; + Phij._FEord = BhomOldX._FEord; Phij._ndof = currelem.GetElemType(Phij._FEord)->GetNDofs(); Phij.Allocate(); //QTYZERO tEST: test of the first Unknown CurrentQuantity Phii(currgp); Phii._dim = 1; - Phii._FEord = bhomOld._FEord; + Phii._FEord = BhomOldX._FEord; Phii._ndof = currelem.GetElemType(Phii._FEord)->GetNDofs(); Phii.Allocate(); @@ -173,20 +188,19 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr currelem.SetElDofsBc(); - bhomOld.GetElemDofs(); - LagMultOld.GetElemDofs(); #if BMAG_QTY==1 if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); #endif -#if VELOCITY_QTY==1 - //----- for Advection MAT & RHS + for (uint idim=0; idim < space_dim; idim++) { - if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); - else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); - } + BhomOld_vec[idim]->GetElemDofs(); +#if VELOCITY_QTY==1 + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); #endif + } const uint el_ngauss = ml_prob.GetQrule(currelem.GetDim()).GetGaussPointsNumber(); @@ -208,14 +222,15 @@ for (uint fe = 0; fe < QL; fe++) { } //======= end of the "COMMON SHAPE PART"================== - bhomOld.val_g(); //---for Time + for (uint idim=0; idim < space_dim; idim++) { + BhomOld_vec[idim]->val_g(); #if VELOCITY_QTY==1 - for (uint idim=0; idim < space_dim; idim++) { - Vel_vec[idim]->val_g(); //---- for Advection MAT & RHS + Vel_vec[idim]->val_g(); //---- for Advection MAT & RHS Vel_vec_val_g[idim] = Vel_vec[idim]->_val_g[0]; - } #endif + } + #if BMAG_QTY==1 Bext.val_g(); //----- for Advection RHS Bext.grad_g(); //----- for Laplacian RHS @@ -231,7 +246,7 @@ for (uint fe = 0; fe < QL; fe++) { //================================ //========= FILLING ELEMENT MAT/RHS //================================= - for (uint i=0; i < bhomOld._ndof; i++) { + for (uint i=0; i < BhomOldX._ndof; i++) { //============ preparation for (i) (Phii) ============ Phii._val_g[0] = currgp._phi_ndsQLVB_g[Phii._FEord][i]; /*const double phii_g*/ for (uint idim=0; idim_val_dofs[i]; //Dirichlet bc } for (uint idim=0; idim_val_g[0] * Phii._grad_g[0][idimp1] ) /*(i,j)*/ /*AdvCurl(MAT,Vel,Phij,Phii,idim,idimp1)*/ @@ -310,7 +325,7 @@ for (uint fe = 0; fe < QL; fe++) { #if (DIMENSION==3) // block +2 [3-4-8] int idimp2=(idim+2)%space_dim;//idimp2 column index - currelem.Mat()(irowq,j+idimp2*bhomOld._ndof) + currelem.Mat()(irowq,j+idimp2*BhomOldX._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( + (1-LAP_MHD)*IRem*( - Phij._grad_g[0][idim]*Phii._grad_g[0][idimp2] ) /*(i,j)*/ - ADV_MHD * Phij._val_g[0]* ( - Vel_vec[idim]->_val_g[0] *Phii._grad_g[0][idimp2] ) /*(i,j)*/ @@ -323,9 +338,9 @@ for (uint fe = 0; fe < QL; fe++) { for (uint j = 0; j < LagMultOld._ndof; j++) {// B^T element matrix ( p*div(v) ) Psij._val_g[0] = currgp._phi_ndsQLVB_g[Psij._FEord][j]; /*const double psij_g */ - const int jclml= j+/*bhomOld._dim*/space_dim*bhomOld._ndof; + const int jclml= j+/*bhomOld._dim*/space_dim*BhomOldX._ndof; for (uint idim=0; idimGetNDofs(); Phij.Allocate(); //QTYZERO tEST: test of the first Unknown CurrentQuantity Phii(currgp); Phii._dim = 1; - Phii._FEord = bhomOld._FEord; + Phii._FEord = BhomOldX._FEord; Phii._ndof = currelem.GetElemType(Phii._FEord)->GetNDofs(); Phii.Allocate(); @@ -485,11 +500,11 @@ for (uint fe = 0; fe < QL; fe++) { currelem.SetElDofsBc(); - bhomOld.GetElemDofs(); + LagMultOld.GetElemDofs(); //============ BC ======= - int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(bhomOld._ndof,space_dim,LagMultOld); + int press_fl = currelem.Bc_ComputeElementBoundaryFlagsFromNodalFlagsForPressure(BhomOldX._ndof,space_dim,LagMultOld); //========END BC========= //========== EXTERNAL DOFS === @@ -543,13 +558,13 @@ for (uint fe = 0; fe < QL; fe++) { // BDRYelement rhs filling - for (uint i=0; i< bhomOld._ndof; i++) { //loop over the BDRYelement dofs + for (uint i=0; i< BhomOldX._ndof; i++) { //loop over the BDRYelement dofs Phii._val_g[0] = currgp._phi_ndsQLVB_g[Phii._FEord][i]; // rhs for (uint idim=0; idim< space_dim; idim++) { - uint irowq=i+idim*bhomOld._ndof; + uint irowq=i+idim*BhomOldX._ndof; currelem.Rhs()(irowq) += currelem.GetBCDofFlag()[irowq]* dtxJxW_g*( -1.*press_fl*LagMultOld._val_g[0]*currgp.get_normal_ptr()[idim]*Phii._val_g[0] diff --git a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp index 406cd9152..8d47b8489 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp @@ -151,11 +151,26 @@ using namespace femus; VelAdj_vec.push_back(&VelAdjZ); //========== - CurrentQuantity Bhom(currgp); - Bhom._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom"); - Bhom.VectWithQtyFillBasic(); - Bhom.Allocate(); - + CurrentQuantity BhomX(currgp); + BhomX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom0"); + BhomX.VectWithQtyFillBasic(); + BhomX.Allocate(); + + CurrentQuantity BhomY(currgp); + BhomY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom1"); + BhomY.VectWithQtyFillBasic(); + BhomY.Allocate(); + + CurrentQuantity BhomZ(currgp); + BhomZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom2"); + BhomZ.VectWithQtyFillBasic(); + BhomZ.Allocate(); + + std::vector Bhom_vec; + Bhom_vec.push_back(&BhomX); + Bhom_vec.push_back(&BhomY); + Bhom_vec.push_back(&BhomZ); + //========= CurrentQuantity Bext(currgp); Bext._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt"); @@ -164,9 +179,9 @@ using namespace femus; //========= auxiliary, must be AFTER Bhom! //TODO this is an example of Vect which is not associated to a Quantity CurrentQuantity Bmag(currgp); //total - Bmag._dim = Bhom._dim; //same as Bhom - Bmag._FEord = Bhom._FEord; //same as Bhom - Bmag._ndof = ml_prob.GetElemType()[currelem.GetDim()-1][Bmag._FEord]->GetNDofs(); + Bmag._dim = Bhom_vec.size(); + Bmag._FEord = BhomX._FEord; + Bmag._ndof = BhomX._ndof; Bmag.Allocate(); //========= END EXTERNAL QUANTITIES ================= @@ -194,10 +209,11 @@ using namespace femus; else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); if ( VelAdj_vec[idim]->_eqnptr != NULL) VelAdj_vec[idim]->GetElemDofs(); else VelAdj_vec[idim]->_qtyptr->FunctionDof(*VelAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); + if ( Bhom_vec[idim]->_eqnptr != NULL ) Bhom_vec[idim]->GetElemDofs(); + else Bhom_vec[idim]->_qtyptr->FunctionDof(*Bhom_vec[idim],0.,&xyz_refbox._val_dofs[0]); + } - if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); - else Bhom._qtyptr->FunctionDof(Bhom,0.,&xyz_refbox._val_dofs[0]); if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); @@ -207,7 +223,7 @@ using namespace femus; for (uint ivarq=0; ivarq < Bmag._dim; ivarq++) { //ivarq is like idim for (uint d=0; d < Bmag._ndof; d++) { const uint indxq = d + ivarq*Bmag._ndof; - Bmag._val_dofs[indxq] = Bext._val_dofs[indxq] + Bhom._val_dofs[indxq]; + Bmag._val_dofs[indxq] = Bext._val_dofs[indxq] + Bhom_vec[ivarq]->_val_dofs[d]; } } //======= diff --git a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp index f069b96aa..fb57f7da0 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp @@ -147,13 +147,35 @@ using namespace femus; VelAdj_vec.push_back(&VelAdjX); VelAdj_vec.push_back(&VelAdjY); VelAdj_vec.push_back(&VelAdjZ); + + - //================== - CurrentQuantity Bhom(currgp); - Bhom._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom"); - Bhom.VectWithQtyFillBasic(); - Bhom.Allocate(); + CurrentQuantity BhomX(currgp); + BhomX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom0"); + BhomX.VectWithQtyFillBasic(); + BhomX.Allocate(); + + CurrentQuantity BhomY(currgp); + BhomY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom1"); + BhomY.VectWithQtyFillBasic(); + BhomY.Allocate(); + CurrentQuantity BhomZ(currgp); + BhomZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom2"); + BhomZ.VectWithQtyFillBasic(); + BhomZ.Allocate(); + + std::vector Bhom_vec; + Bhom_vec.push_back(&BhomX); + Bhom_vec.push_back(&BhomY); + Bhom_vec.push_back(&BhomZ); + + CurrentQuantity Bhom_vecQuant(currgp); //without quantity, nor equation + Bhom_vecQuant._dim = Bhom_vec.size(); + Bhom_vecQuant._FEord = Bhom_vec[0]->_FEord; + Bhom_vecQuant._ndof = Bhom_vec[0]->_ndof; + Bhom_vecQuant.Allocate(); + //=============== //=============== CurrentQuantity BhomAdjX(currgp); @@ -200,18 +222,19 @@ using namespace femus; for (uint idim=0; idim < space_dim; idim++) { - if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); - else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); - if ( VelAdj_vec[idim]->_eqnptr != NULL) VelAdj_vec[idim]->GetElemDofs(); - else VelAdj_vec[idim]->_qtyptr->FunctionDof(*VelAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); + if ( VelAdj_vec[idim]->_eqnptr != NULL) VelAdj_vec[idim]->GetElemDofs(); + else VelAdj_vec[idim]->_qtyptr->FunctionDof(*VelAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); if ( BhomAdj_vec[idim]->_eqnptr != NULL ) BhomAdj_vec[idim]->GetElemDofs(); else BhomAdj_vec[idim]->_qtyptr->FunctionDof(*BhomAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); + if ( Bhom_vec[idim]->_eqnptr != NULL ) Bhom_vec[idim]->GetElemDofs(); + else Bhom_vec[idim]->_qtyptr->FunctionDof(*Bhom_vec[idim],0.,&xyz_refbox._val_dofs[0]); } - if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); - else Bhom._qtyptr->FunctionDof(Bhom,0.,&xyz_refbox._val_dofs[0]); BhomAdj_vecQuant.GetElemDofs(BhomAdj_vec); + Bhom_vecQuant.GetElemDofs(Bhom_vec); //============================================================== //================== GAUSS LOOP (qp loop) ====================== @@ -238,12 +261,12 @@ for (uint fe = 0; fe < QL; fe++) { //========preparation for things that are independent of (i,j), dofs of test and shape ===================== BhomAdj_vecQuant.curl_g(); - Bhom.curl_g(); + Bhom_vecQuant.curl_g(); BeOld.val_g(); - Bhom.val_g(); for (uint idim=0; idimgrad_g(); + Bhom_vec[idim]->val_g(); Vel_vec[idim]->val_g(); VelAdj_vec[idim]->val_g(); Vel_vec_val_g[idim] = Vel_vec[idim]->_val_g[0]; @@ -255,7 +278,7 @@ for (uint fe = 0; fe < QL; fe++) { Math::extend(&VelAdj_vec_val_g[0],&VelAdj_vec_val_g3D[0],space_dim); Math::cross(&BhomAdj_vecQuant._curl_g3D[0], &Vel_vec_val_g3D[0],curlxiXvel_g3D ); - Math::cross( &Bhom._curl_g3D[0],&VelAdj_vec_val_g3D[0],curlbXlambda_g3D ); + Math::cross( &Bhom_vecQuant._curl_g3D[0],&VelAdj_vec_val_g3D[0],curlbXlambda_g3D ); //========end preparation for things that are independent of (i,j) dofs of test and shape ===================== //================================ @@ -277,7 +300,9 @@ for (uint fe = 0; fe < QL; fe++) { Math::extend(dphiidx_g,dphiidx_g3D,space_dim); Math::cross(&BhomAdj_vecQuant._curl_g3D[0],dphiidx_g3D,curlxiXdphii_g3D); - double bDdphii_g = Math::dot( &Bhom._val_g[0],dphiidx_g,space_dim); + double bDdphii_g = 0.; + for (uint idim=0; idim_val_g[0]*dphiidx_g[idim]; + double lambdaDdphii_g = Math::dot(&VelAdj_vec_val_g[0],dphiidx_g,space_dim); for (uint idim=0; idim_val_g[0] - lambdaDdphii_g*Bhom._val_g[idim]) //from NS + + S*(bDdphii_g*VelAdj_vec[idim]->_val_g[0] - lambdaDdphii_g*Bhom_vec[idim]->_val_g[0]) //from NS ) +(1-currelem.GetBCDofFlag()[irowq])*detb*BeOld._val_dofs[irowq]; //Dirichlet bc } diff --git a/applications/OptimalControl/mhdopt/EqnNS.cpp b/applications/OptimalControl/mhdopt/EqnNS.cpp index 3aa00ad4b..53713e151 100644 --- a/applications/OptimalControl/mhdopt/EqnNS.cpp +++ b/applications/OptimalControl/mhdopt/EqnNS.cpp @@ -58,9 +58,6 @@ //================================================ - const double time = 0.; //ml_prob._timeloop._curr_time; - - //==========FLAG FOR STATIONARITY OR NOT //FLAG for the TIME DISCRETIZATION //every Equation may have a TimeDiscretization @@ -203,11 +200,28 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); //============================ MAG WORLD ======================================= #if BMAG_QTY==1 - CurrentQuantity Bhom(currgp); //only to retrieve the dofs - Bhom._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom"); - Bhom.VectWithQtyFillBasic(); - Bhom.Allocate(); + CurrentQuantity BhomX(currgp); + BhomX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom0"); + BhomX.VectWithQtyFillBasic(); + BhomX.Allocate(); + + CurrentQuantity BhomY(currgp); + BhomY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom1"); + BhomY.VectWithQtyFillBasic(); + BhomY.Allocate(); + + CurrentQuantity BhomZ(currgp); + BhomZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom2"); + BhomZ.VectWithQtyFillBasic(); + BhomZ.Allocate(); + + std::vector Bhom_vec; + Bhom_vec.push_back(&BhomX); + Bhom_vec.push_back(&BhomY); + Bhom_vec.push_back(&BhomZ); + //Bhom only to retrieve the dofs + //========= CurrentQuantity Bext(currgp); //only to retrieve the dofs Bext._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt"); @@ -216,9 +230,9 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); //========= auxiliary, must be AFTER Bhom! CurrentQuantity Bmag(currgp); //total - Bmag._dim = Bhom._dim; - Bmag._FEord = Bhom._FEord; - Bmag._ndof = ml_prob.GetElemType()[currelem.GetDim()-1][Bmag._FEord]->GetNDofs(); + Bmag._dim = Bhom_vec.size(); + Bmag._FEord = BhomX._FEord; + Bmag._ndof = BhomX._ndof; Bmag.Allocate(); #endif //======================== MAG WORLD ================================ @@ -256,9 +270,12 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); //=======RETRIEVE the DOFS of the COUPLED QUANTITIES #if (BMAG_QTY==1) if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); - else Bext._qtyptr->FunctionDof(Bext,time,&xyz_refbox._val_dofs[0]); - if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); - else Bhom._qtyptr->FunctionDof(Bhom,time,&xyz_refbox._val_dofs[0]); + else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); + + for (uint idim=0; idim < space_dim; idim++) { + if ( Bhom_vec[idim]->_eqnptr != NULL ) Bhom_vec[idim]->GetElemDofs(); + else Bhom_vec[idim]->_qtyptr->FunctionDof(*Bhom_vec[idim],0.,&xyz_refbox._val_dofs[0]); + } #endif //=== the connectivity is only related to the ELEMENT, so it is GEOMETRICAL @@ -274,7 +291,7 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); for (uint ivarq=0; ivarq < Bmag._dim; ivarq++) { //ivarq is like idim for (uint d=0; d < Bmag._ndof; d++) { const uint indxq = d + ivarq*Bmag._ndof; - Bmag._val_dofs[indxq] = Bext._val_dofs[indxq] + Bhom._val_dofs[indxq]; + Bmag._val_dofs[indxq] = Bext._val_dofs[indxq] + Bhom_vec[ivarq]->_val_dofs[d]; } } //=======after summing you EXTEND them to 3D @@ -609,7 +626,7 @@ for (uint fe = 0; fe < QL; fe++) { //=======end "COMMON SHAPE PART"=================================== xyz_refbox.val_g(); - pressOld._qtyptr->Function_txyz(time,&xyz_refbox._val_g[0],&pressOld._val_g[0]); //i prefer using the function instead of the p_old vector + pressOld._qtyptr->Function_txyz(0.,&xyz_refbox._val_g[0],&pressOld._val_g[0]); //i prefer using the function instead of the p_old vector // pressOld.val_g(); //this is the alternative //============================================================== diff --git a/applications/OptimalControl/mhdopt/EqnNSAD.cpp b/applications/OptimalControl/mhdopt/EqnNSAD.cpp index 033ef7df2..a44680bc6 100644 --- a/applications/OptimalControl/mhdopt/EqnNSAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnNSAD.cpp @@ -153,21 +153,38 @@ using namespace femus; - CurrentQuantity Bhom(currgp); - Bhom._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom"); - Bhom.VectWithQtyFillBasic(); - Bhom.Allocate(); + CurrentQuantity BhomX(currgp); + BhomX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom0"); + BhomX.VectWithQtyFillBasic(); + BhomX.Allocate(); + + CurrentQuantity BhomY(currgp); + BhomY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom1"); + BhomY.VectWithQtyFillBasic(); + BhomY.Allocate(); + + CurrentQuantity BhomZ(currgp); + BhomZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHom2"); + BhomZ.VectWithQtyFillBasic(); + BhomZ.Allocate(); + + std::vector Bhom_vec; + Bhom_vec.push_back(&BhomX); + Bhom_vec.push_back(&BhomY); + Bhom_vec.push_back(&BhomZ); - CurrentQuantity Bext(currgp); + //Bhom only to retrieve the dofs + + CurrentQuantity Bext(currgp); Bext._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt"); Bext.VectWithQtyFillBasic(); Bext.Allocate(); //========= auxiliary, must be AFTER Bhom! //TODO this doesnt have any associated quantity! CurrentQuantity Bmag(currgp); //total - Bmag._dim = Bhom._dim; //same as Bhom - Bmag._FEord = Bhom._FEord; //same as Bhom - Bmag._ndof = ml_prob.GetElemType()[currelem.GetDim()-1][Bmag._FEord]->GetNDofs(); + Bmag._dim = Bhom_vec.size(); + Bmag._FEord = BhomX._FEord; + Bmag._ndof = BhomX._ndof; Bmag.Allocate(); //=============== @@ -211,8 +228,6 @@ using namespace femus; currelem.SetElDofsBc(); - if ( Bhom._eqnptr != NULL ) Bhom.GetElemDofs(); - else Bhom._qtyptr->FunctionDof(Bhom,0.,&xyz_refbox._val_dofs[0]); if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); @@ -224,11 +239,12 @@ using namespace femus; else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],0.,&xyz_refbox._val_dofs[0]); if ( BhomAdj_vec[idim]->_eqnptr != NULL ) BhomAdj_vec[idim]->GetElemDofs(); else BhomAdj_vec[idim]->_qtyptr->FunctionDof(*BhomAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); - - } + if ( Bhom_vec[idim]->_eqnptr != NULL ) Bhom_vec[idim]->GetElemDofs(); + else Bhom_vec[idim]->_qtyptr->FunctionDof(*Bhom_vec[idim],0.,&xyz_refbox._val_dofs[0]); + } - BhomAdj_vecQuant.GetElemDofs(BhomAdj_vec); + BhomAdj_vecQuant.GetElemDofs(BhomAdj_vec); //this must be AFTER filling the scalar components PressAdjOld.GetElemDofs(); @@ -238,7 +254,7 @@ using namespace femus; for (uint ivarq=0; ivarq < Bmag._dim; ivarq++) { //ivarq is like idim for (uint d=0; d < Bmag._ndof; d++) { const uint indxq = d + ivarq*Bmag._ndof; - Bmag._val_dofs[indxq] = Bext._val_dofs[indxq] + Bhom._val_dofs[indxq]; + Bmag._val_dofs[indxq] = Bext._val_dofs[indxq] + Bhom_vec[ivarq]->_val_dofs[d]; } } //======= diff --git a/applications/OptimalControl/mhdopt/OptQuantities.cpp b/applications/OptimalControl/mhdopt/OptQuantities.cpp index 0ed9e6b15..6d66a66a6 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.cpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.cpp @@ -19,7 +19,21 @@ // ================================================================== //=========================================================================== -MagnFieldHom::MagnFieldHom(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) +MagnFieldHomX::MagnFieldHomX(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) +: Quantity(name_in,qtymap_in,dim_in,FEord_in) { + + for (uint i=0;iget("Bref"); +} + +//=========================================================================== +MagnFieldHomY::MagnFieldHomY(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) +: Quantity(name_in,qtymap_in,dim_in,FEord_in) { + + for (uint i=0;iget("Bref"); +} + +//=========================================================================== +MagnFieldHomZ::MagnFieldHomZ(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) : Quantity(name_in,qtymap_in,dim_in,FEord_in) { for (uint i=0;iget("Bref"); @@ -481,7 +495,15 @@ return; //here, the box measures must be available, because e have to shift once more the reference frame //now we'll pass it here, but later we'll put that as a class variable or something -void MagnFieldHom::Function_txyz(const double t, const double* xp, double* func) const { +void MagnFieldHomX::Function_txyz(const double t, const double* xp, double* func) const { + + func[0] = 0.; + return; +} + + + +void MagnFieldHomY::Function_txyz(const double t, const double* xp, double* func) const { //============== PICK THE REQUIRED REFERENCE VALUES const double Lref = _qtymap.GetInputParser()->get("Lref"); @@ -523,13 +545,7 @@ void MagnFieldHom::Function_txyz(const double t, const double* xp, double* func) const double magnitude = 0.*DpDzad/S*Lhalf/Lref*(sinh(Hm/LHm*Lref/Lhalf*xtr) - xtr*Lref/Lhalf*sinh(Hm/LHm)) / sinh(Hm/LHm); - func[0] = -sin(thetaz)*magnitude; //0./Bref; - func[1] = cos(thetaz)*magnitude; //DpDzad/S*Lhalf/Lref*(sinh(Hm/LHm*Lref/Lhalf*xtr) - xtr*Lref/Lhalf*sinh(Hm/LHm)) / sinh(Hm/LHm) ; -#if (DIMENSION==3) - func[2] = 0./*/Bref*/; -#endif - - + func[0] = magnitude; //DpDzad/S*Lhalf/Lref*(sinh(Hm/LHm*Lref/Lhalf*xtr) - xtr*Lref/Lhalf*sinh(Hm/LHm)) / sinh(Hm/LHm) ; // !!!!! REFERENCE TIME!!! if you change Lref, you have to change Uref so as to have TIMEref=1 //AAA p changes!!! @@ -550,11 +566,15 @@ void MagnFieldHom::Function_txyz(const double t, const double* xp, double* func) //where is the TWO FACTOR? //well, actually I think that when the Hartmann number goes big the ratio //between two maximum points is exactly TWO, so actually we have a different Bref... ? -return; -} + return; +} +void MagnFieldHomZ::Function_txyz(const double t, const double* xp, double* func) const { + func[0] = 0.; + return; +} @@ -979,7 +999,7 @@ Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); -void MagnFieldHom::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { +void MagnFieldHomX::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { const double bdry_toll = DEFAULT_BDRY_TOLL; @@ -1004,60 +1024,44 @@ Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); if ( (x_rotshift[0]) > -bdry_toll && ( x_rotshift[0]) < bdry_toll ) { // bc_flag[0]=0; //b.n useless with curl curl - bc_flag[1]=0; //bxn } if ( (le[0]-lb[0]) -(x_rotshift[0]) > -bdry_toll && (le[0]-lb[0]) -(x_rotshift[0]) < bdry_toll){ // bc_flag[0]=0; //b.n useless with curl curl - bc_flag[1]=0; //bxn } if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { bc_flag[0]=0; //bxn -// bc_flag[1]=0; //leave this free } if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { bc_flag[0]=0; //bxn -// bc_flag[1]=0; //leave this free } #else if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { // INSULATING bc_flag[0]=0; //b.n - bc_flag[1]=0; //bxn - bc_flag[2]=0; //bxn } if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll){ // INSULATING bc_flag[0]=0; //b.n - bc_flag[1]=0; //bxn - bc_flag[2]=0; //bxn } if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll) { bc_flag[0]=0; //bxn -// bc_flag[1]=0; //b.n //leave this free for inlet -// bc_flag[2]=0; //bxn //WHY ISNT THIS FIXED AS WELL? } if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { bc_flag[0]=0; //bxn -// bc_flag[1]=0; //b.n //leave this free for outlet -// bc_flag[2]=0; //bxn //WHY ISNT THIS FIXED AS WELL? } if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { // CONDUCTING, now insulating if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //bxn - if (bc_flag[1] == 1) bc_flag[1] = _qtymap.GetInputParser()->get("Fake3D"); //bxn //leave this free for 2D -// bc_flag[2]=0; //b.n } if ((le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll) { // CONDUCTING, now insulating if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //bxn - if (bc_flag[1] == 1) bc_flag[1] = _qtymap.GetInputParser()->get("Fake3D"); //bxn //leave this free for 2D -// bc_flag[2]=0; //b.n } #endif @@ -1068,9 +1072,128 @@ Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); } +void MagnFieldHomY::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { + + const double bdry_toll = DEFAULT_BDRY_TOLL; + +Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + + std::vector lb(_qtymap.GetMeshTwo()->get_dim()); + std::vector le(_qtymap.GetMeshTwo()->get_dim()); + lb[0] = box->_lb[0]; //already nondimensionalized + le[0] = box->_le[0]; + lb[1] = box->_lb[1]; + le[1] = box->_le[1]; + if (_qtymap.GetMeshTwo()->get_dim() == 3) { + lb[2] = box->_lb[2]; + le[2] = box->_le[2]; + } + + std::vector x_rotshift(_qtymap.GetMeshTwo()->get_dim()); + _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); + + + #if (DIMENSION==2) + + if ( (x_rotshift[0]) > -bdry_toll && ( x_rotshift[0]) < bdry_toll ) { + bc_flag[0]=0; //bxn + } + + if ( (le[0]-lb[0]) -(x_rotshift[0]) > -bdry_toll && (le[0]-lb[0]) -(x_rotshift[0]) < bdry_toll){ + bc_flag[0]=0; //bxn + } + + if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { +// bc_flag[0]=0; //leave this free + } + + if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { +// bc_flag[0]=0; //leave this free + } + +#else + + if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { // INSULATING + bc_flag[0]=0; //bxn + } + + if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll){ // INSULATING + bc_flag[0]=0; //bxn + } + + if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll) { +// bc_flag[0]=0; //b.n //leave this free for inlet + } + + if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { +// bc_flag[0]=0; //b.n //leave this free for outlet + } + + if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { // CONDUCTING, now insulating + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //bxn //leave this free for 2D + } + + if ((le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll) { // CONDUCTING, now insulating + if (bc_flag[0] == 1) bc_flag[0] = _qtymap.GetInputParser()->get("Fake3D"); //bxn //leave this free for 2D + } + +#endif + + + return; + +} + + +void MagnFieldHomZ::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { + + const double bdry_toll = DEFAULT_BDRY_TOLL; + +Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + std::vector lb(_qtymap.GetMeshTwo()->get_dim()); + std::vector le(_qtymap.GetMeshTwo()->get_dim()); + lb[0] = box->_lb[0]; //already nondimensionalized + le[0] = box->_le[0]; + lb[1] = box->_lb[1]; + le[1] = box->_le[1]; + if (_qtymap.GetMeshTwo()->get_dim() == 3) { + lb[2] = box->_lb[2]; + le[2] = box->_le[2]; + } + + std::vector x_rotshift(_qtymap.GetMeshTwo()->get_dim()); + _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); + if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { // INSULATING + bc_flag[0]=0; //bxn + } + + if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll){ // INSULATING + bc_flag[0]=0; //bxn + } + + if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll) { +// bc_flag[0]=0; //bxn //WHY ISNT THIS FIXED AS WELL? + } + + if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { +// bc_flag[0]=0; //bxn //WHY ISNT THIS FIXED AS WELL? + } + + if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { // CONDUCTING, now insulating +// bc_flag[0]=0; //b.n + } + + if ((le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll) { // CONDUCTING, now insulating +// bc_flag[0]=0; //b.n + } + + return; + +} + void MagnFieldHomAdjX::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { @@ -1875,19 +1998,28 @@ void Pressure::initialize_xyz(const double* xp, std::vector< double >& value) co return; } -void MagnFieldHom::initialize_xyz(const double* xp, std::vector< double >& value) const { +void MagnFieldHomX::initialize_xyz(const double* xp, std::vector< double >& value) const { - const double Bref = _qtymap.GetInputParser()->get("Bref"); - - value[0] = 0./Bref; - value[1] = 0./Bref; -#if (DIMENSION==3) - value[2] = 0./Bref; -#endif + value[0] = 0.; + return; +} + + +void MagnFieldHomY::initialize_xyz(const double* xp, std::vector< double >& value) const { + + value[0] = 0.; return; } +void MagnFieldHomZ::initialize_xyz(const double* xp, std::vector< double >& value) const { + + value[0] = 0.; + + return; +} + + void MagnFieldHomLagMult::initialize_xyz(const double* xp, std::vector< double >& value) const { const double Uref = _qtymap.GetInputParser()->get("Uref"); diff --git a/applications/OptimalControl/mhdopt/OptQuantities.hpp b/applications/OptimalControl/mhdopt/OptQuantities.hpp index e3b1e60df..8ffaba7e6 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.hpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.hpp @@ -13,11 +13,37 @@ using namespace femus; -class MagnFieldHom : public Quantity { +class MagnFieldHomX : public Quantity { public: - MagnFieldHom(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + MagnFieldHomX(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; + void initialize_xyz(const double* xp, std::vector & value) const; + + +}; + +class MagnFieldHomY : public Quantity { + + public: + + MagnFieldHomY(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; + void initialize_xyz(const double* xp, std::vector & value) const; + + +}; + +class MagnFieldHomZ : public Quantity { + + public: + + MagnFieldHomZ(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; diff --git a/applications/OptimalControl/mhdopt/main.cpp b/applications/OptimalControl/mhdopt/main.cpp index 16a8a453a..983087b53 100644 --- a/applications/OptimalControl/mhdopt/main.cpp +++ b/applications/OptimalControl/mhdopt/main.cpp @@ -126,7 +126,10 @@ int main(int argc, char** argv) { MagnFieldHomAdjY bhom_adjY("Qty_MagnFieldHomAdj1",qty_map,1,QQ); qty_map.AddQuantity(&bhom_adjY); MagnFieldHomAdjZ bhom_adjZ("Qty_MagnFieldHomAdj2",qty_map,1,QQ); qty_map.AddQuantity(&bhom_adjZ); - MagnFieldHom bhom("Qty_MagnFieldHom",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&bhom); + MagnFieldHomX bhomX("Qty_MagnFieldHom0",qty_map,1,QQ); qty_map.AddQuantity(&bhomX); + MagnFieldHomY bhomY("Qty_MagnFieldHom1",qty_map,1,QQ); qty_map.AddQuantity(&bhomY); + MagnFieldHomZ bhomZ("Qty_MagnFieldHom2",qty_map,1,QQ); qty_map.AddQuantity(&bhomZ); + MagnFieldExt Bext("Qty_MagnFieldExt",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&Bext); MagnFieldHomLagMult bhom_lag_mult("Qty_MagnFieldHomLagMult",qty_map,1,LL); qty_map.AddQuantity(&bhom_lag_mult); @@ -135,13 +138,13 @@ int main(int argc, char** argv) { Pressure pressure("Qty_Pressure",qty_map,1,LL); qty_map.AddQuantity(&pressure); PressureAdj pressure_adj("Qty_PressureAdj",qty_map,1,LL); qty_map.AddQuantity(&pressure_adj); - DesVelocityX des_velocityX("Qty_DesVelocity0",qty_map,1,QQ); qty_map.AddQuantity(&des_velocityX); - DesVelocityY des_velocityY("Qty_DesVelocity1",qty_map,1,QQ); qty_map.AddQuantity(&des_velocityY); - DesVelocityZ des_velocityZ("Qty_DesVelocity2",qty_map,1,QQ); qty_map.AddQuantity(&des_velocityZ); + DesVelocityX des_velocityX("Qty_DesVelocity0",qty_map,1,QQ); qty_map.AddQuantity(&des_velocityX); + DesVelocityY des_velocityY("Qty_DesVelocity1",qty_map,1,QQ); qty_map.AddQuantity(&des_velocityY); + DesVelocityZ des_velocityZ("Qty_DesVelocity2",qty_map,1,QQ); qty_map.AddQuantity(&des_velocityZ); //consistency check - if (bhom._dim != Bext._dim) {std::cout << "main: inconsistency" << std::endl;abort();} - if (bhom._FEord != Bext._FEord) {std::cout << "main: inconsistency" << std::endl;abort();} +// if (bhom._dim != Bext._dim) {std::cout << "main: inconsistency" << std::endl;abort();} +// if (bhom._FEord != Bext._FEord) {std::cout << "main: inconsistency" << std::endl;abort();} // if (velocity._dim != des_velocity._dim) {std::cout << "main: inconsistency" << std::endl; abort();} // if (velocity._FEord != des_velocity._FEord) {std::cout << "main: inconsistency" << std::endl; abort();} @@ -225,7 +228,9 @@ int main(int argc, char** argv) { eqnMHD.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldHom"); eqnMHD.AddSolutionToSystemPDE("Qty_MagnFieldHomLagMult"); - eqnMHD.AddUnknownToSystemPDE(&bhom); + eqnMHD.AddUnknownToSystemPDE(&bhomX); + eqnMHD.AddUnknownToSystemPDE(&bhomY); + eqnMHD.AddUnknownToSystemPDE(&bhomZ); eqnMHD.AddUnknownToSystemPDE(&bhom_lag_mult); eqnMHD.SetAssembleFunction(GenMatRhsMHD); From e368bcb8210674c8d78e454085599cd8f64f56a3 Mon Sep 17 00:00:00 2001 From: Giorgio Bornia Date: Wed, 8 Apr 2015 23:12:40 -0500 Subject: [PATCH 18/19] MagnFieldExt with scalar components in mhdopt --- applications/OptimalControl/mhdopt/EqnMHD.cpp | 115 ++++++---- .../OptimalControl/mhdopt/EqnMHDAD.cpp | 40 ++-- .../OptimalControl/mhdopt/EqnMHDCONT.cpp | 93 ++++---- applications/OptimalControl/mhdopt/EqnNS.cpp | 44 ++-- .../OptimalControl/mhdopt/EqnNSAD.cpp | 41 ++-- .../OptimalControl/mhdopt/OptQuantities.cpp | 212 +++++++++++++----- .../OptimalControl/mhdopt/OptQuantities.hpp | 30 ++- applications/OptimalControl/mhdopt/main.cpp | 12 +- 8 files changed, 400 insertions(+), 187 deletions(-) diff --git a/applications/OptimalControl/mhdopt/EqnMHD.cpp b/applications/OptimalControl/mhdopt/EqnMHD.cpp index 47e7f4bc3..5bf13cdb4 100644 --- a/applications/OptimalControl/mhdopt/EqnMHD.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHD.cpp @@ -40,6 +40,8 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr //==== Operators @ gauss ======== std::vector Vel_vec_val_g(space_dim); std::vector Vel_vec_val_g3D(3); + std::vector Bext_vec_val_g(space_dim); + std::vector Bext_vec_val_g3D(3); double vXBe_g3D[3]; double vXBeXdphii_g3D[3]; double curlBeXdphii_g3D[3]; @@ -145,11 +147,32 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr xyz_refbox._ndof = myel->GetElementDofNumber(ZERO_ELEM,BIQUADR_FE); xyz_refbox.Allocate(); - CurrentQuantity Bext(currgp); - Bext._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt"); - Bext.VectWithQtyFillBasic(); - Bext.Allocate(); - + CurrentQuantity BextX(currgp); + BextX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt0"); + BextX.VectWithQtyFillBasic(); + BextX.Allocate(); + + CurrentQuantity BextY(currgp); + BextY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt1"); + BextY.VectWithQtyFillBasic(); + BextY.Allocate(); + + CurrentQuantity BextZ(currgp); + BextZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt2"); + BextZ.VectWithQtyFillBasic(); + BextZ.Allocate(); + + std::vector Bext_vec; + Bext_vec.push_back(&BextX); + Bext_vec.push_back(&BextY); + Bext_vec.push_back(&BextZ); + + CurrentQuantity Bext_vecQuant(currgp); //without quantity, nor equation + Bext_vecQuant._dim = Bext_vec.size(); + Bext_vecQuant._FEord = Bext_vec[0]->_FEord; + Bext_vecQuant._ndof = Bext_vec[0]->_ndof; + Bext_vecQuant.Allocate(); + #if VELOCITY_QTY==1 CurrentQuantity VelX(currgp); VelX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Velocity0"); @@ -189,19 +212,20 @@ void GenMatRhsMHD(MultiLevelProblem &ml_prob, unsigned Level, const unsigned &gr currelem.SetElDofsBc(); -#if BMAG_QTY==1 - if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); - else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); -#endif - for (uint idim=0; idim < space_dim; idim++) { BhomOld_vec[idim]->GetElemDofs(); #if VELOCITY_QTY==1 if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); - else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); #endif + if ( Bext_vec[idim]->_eqnptr != NULL ) Bext_vec[idim]->GetElemDofs(); + else Bext_vec[idim]->_qtyptr->FunctionDof(*Bext_vec[idim],0.,&xyz_refbox._val_dofs[0]); + } + Bext_vecQuant.GetElemDofs(Bext_vec); + + const uint el_ngauss = ml_prob.GetQrule(currelem.GetDim()).GetGaussPointsNumber(); for (uint qp = 0; qp < el_ngauss; qp++) { @@ -227,20 +251,21 @@ for (uint fe = 0; fe < QL; fe++) { BhomOld_vec[idim]->val_g(); #if VELOCITY_QTY==1 Vel_vec[idim]->val_g(); //---- for Advection MAT & RHS - Vel_vec_val_g[idim] = Vel_vec[idim]->_val_g[0]; + Vel_vec_val_g[idim] = Vel_vec[idim]->_val_g[0]; #endif + Bext_vec[idim]->val_g(); //----- for Advection RHS + Bext_vec_val_g[idim] = Bext_vec[idim]->_val_g[0]; + Bext_vec[idim]->grad_g(); //----- for Laplacian RHS } #if BMAG_QTY==1 - Bext.val_g(); //----- for Advection RHS - Bext.grad_g(); //----- for Laplacian RHS - Bext.curl_g(); //----- for Curl Curl RHS //THE EXTENSION of the DOFS to 3D is done INSIDE!! + Bext_vecQuant.curl_g(); //----- for Curl Curl RHS //THE EXTENSION of the DOFS to 3D is done INSIDE!! #endif #if (VELOCITY_QTY==1) && (BMAG_QTY==1) //in this case we have two couplings with external quantities Math::extend(&Vel_vec_val_g[0],&Vel_vec_val_g3D[0],space_dim); //----- for Advection RHS - Math::extend(&Bext._val_g[0],&Bext._val_g3D[0],space_dim); //----- for Advection RHS - Math::cross(&Vel_vec_val_g3D[0],&Bext._val_g3D[0],vXBe_g3D); //----- for Advection RHS + Math::extend(&Bext_vec_val_g[0],&Bext_vec_val_g3D[0],space_dim); //----- for Advection RHS + Math::cross(&Vel_vec_val_g3D[0],&Bext_vec_val_g3D[0],vXBe_g3D); //----- for Advection RHS #endif //================================ @@ -259,14 +284,14 @@ for (uint fe = 0; fe < QL; fe++) { for (uint idim=0; idim_grad_g[0][jdim]*Phii._grad_g[0][jdim]; } } Math::extend(&Phii._grad_g[0][0],&Phii._grad_g3D[0][0],space_dim); //--------- CURL CURL: Operator, RHS: curl Be . curl phi ------------------- - Math::cross(&Bext._curl_g3D[0],&Phii._grad_g3D[0][0],curlBeXdphii_g3D); + Math::cross(&Bext_vecQuant._curl_g3D[0],&Phii._grad_g3D[0][0],curlBeXdphii_g3D); //--------- ADVECTION: Operator, RHS: v x Be . curl phi ------------------- Math::cross( vXBe_g3D,&Phii._grad_g3D[0][0], vXBeXdphii_g3D); // _utils.cross(vXBe_g3D,dphiidx_g3D,vXBeXdphii_g3D); @@ -451,10 +476,25 @@ for (uint fe = 0; fe < QL; fe++) { xyz_refbox._ndof = myel->GetElementFaceDofNumber(ZERO_ELEM,ZERO_FACE,BIQUADR_FE); xyz_refbox.Allocate(); - CurrentQuantity Bext(currgp); - Bext._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt"); - Bext.VectWithQtyFillBasic(); - Bext.Allocate(); + CurrentQuantity BextX(currgp); + BextX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt0"); + BextX.VectWithQtyFillBasic(); + BextX.Allocate(); + + CurrentQuantity BextY(currgp); + BextY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt1"); + BextY.VectWithQtyFillBasic(); + BextY.Allocate(); + + CurrentQuantity BextZ(currgp); + BextZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt2"); + BextZ.VectWithQtyFillBasic(); + BextZ.Allocate(); + + std::vector Bext_vec; + Bext_vec.push_back(&BextX); + Bext_vec.push_back(&BextY); + Bext_vec.push_back(&BextZ); #if VELOCITY_QTY==1 CurrentQuantity VelX(currgp); @@ -508,17 +548,12 @@ for (uint fe = 0; fe < QL; fe++) { //========END BC========= //========== EXTERNAL DOFS === -#if BMAG_QTY==1 - if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); - else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); -#endif -#if VELOCITY_QTY==1 for (uint idim=0; idim < space_dim; idim++) { - if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); - else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); - } -#endif - + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); + if ( Bext_vec[idim]->_eqnptr != NULL ) Bext_vec[idim]->GetElemDofs(); + else Bext_vec[idim]->_qtyptr->FunctionDof(*Bext_vec[idim],0.,&xyz_refbox._val_dofs[0]); + } const uint el_ngauss = ml_prob.GetQrule(currelem.GetDim()).GetGaussPointsNumber(); @@ -539,19 +574,17 @@ for (uint fe = 0; fe < QL; fe++) { xyz_refbox.val_g(); // val_g(vb,xyz); //CHECK the QUADRATICS!!!!!!!!! LagMultOld._qtyptr->Function_txyz(0.,&xyz_refbox._val_g[0],&LagMultOld._val_g[0]); //check that you have ZERO here -#if VELOCITY_QTY==1 for (uint idim=0; idim < space_dim; idim++) { - Vel_vec[idim]->val_g(); + Vel_vec[idim]->val_g(); Vel_vec_val_g[idim] = Vel_vec[idim]->_val_g[0]; + Bext_vec[idim]->val_g(); + Bext_vec_val_g[idim] = Bext_vec[idim]->_val_g[0]; } -#endif -#if BMAG_QTY==1 - Bext.val_g(); -#endif + #if (VELOCITY_QTY==1) && (BMAG_QTY==1) Math::extend(&Vel_vec_val_g[0],&Vel_vec_val_g3D[0],space_dim); - Math::extend(&Bext._val_g[0],&Bext._val_g3D[0],space_dim); - Math::cross(&Vel_vec_val_g3D[0],&Bext._val_g3D[0],velXBext_g3D); + Math::extend(&Bext_vec_val_g[0],&Bext_vec_val_g3D[0],space_dim); + Math::cross(&Vel_vec_val_g3D[0],&Bext_vec_val_g3D[0],velXBext_g3D); Math::extend(currgp.get_normal_ptr(),normal_g3D,space_dim); Math::cross(velXBext_g3D,normal_g3D,velXBextXn_g3D); #endif diff --git a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp index 8d47b8489..fb99c317e 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp @@ -89,7 +89,7 @@ using namespace femus; CurrentQuantity BhomLagMultAdjOld(currgp); BhomLagMultAdjOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldHomLagMultAdj"); BhomLagMultAdjOld.VectWithQtyFillBasic(); - BhomLagMultAdjOld.Allocate(); + BhomLagMultAdjOld.Allocate(); /// @todo probably this Allocate not needed here //========= END INTERNAL QUANTITIES (unknowns of the equation) ================= //=========EXTERNAL QUANTITIES (couplings) ===== @@ -172,12 +172,27 @@ using namespace femus; Bhom_vec.push_back(&BhomZ); //========= - CurrentQuantity Bext(currgp); - Bext._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt"); - Bext.VectWithQtyFillBasic(); - Bext.Allocate(); - -//========= auxiliary, must be AFTER Bhom! //TODO this is an example of Vect which is not associated to a Quantity + CurrentQuantity BextX(currgp); + BextX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt0"); + BextX.VectWithQtyFillBasic(); + BextX.Allocate(); + + CurrentQuantity BextY(currgp); + BextY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt1"); + BextY.VectWithQtyFillBasic(); + BextY.Allocate(); + + CurrentQuantity BextZ(currgp); + BextZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt2"); + BextZ.VectWithQtyFillBasic(); + BextZ.Allocate(); + + std::vector Bext_vec; + Bext_vec.push_back(&BextX); + Bext_vec.push_back(&BextY); + Bext_vec.push_back(&BextZ); + +//========= auxiliary, must be AFTER Bhom! CurrentQuantity Bmag(currgp); //total Bmag._dim = Bhom_vec.size(); Bmag._FEord = BhomX._FEord; @@ -200,9 +215,8 @@ using namespace femus; currelem.SetElDofsBc(); - BhomLagMultAdjOld.GetElemDofs(); - for (uint idim=0; idim < space_dim; idim++) { + BhomAdjOld_vec[idim]->GetElemDofs(); if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); @@ -211,11 +225,11 @@ using namespace femus; else VelAdj_vec[idim]->_qtyptr->FunctionDof(*VelAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); if ( Bhom_vec[idim]->_eqnptr != NULL ) Bhom_vec[idim]->GetElemDofs(); else Bhom_vec[idim]->_qtyptr->FunctionDof(*Bhom_vec[idim],0.,&xyz_refbox._val_dofs[0]); - + if ( Bext_vec[idim]->_eqnptr != NULL ) Bext_vec[idim]->GetElemDofs(); + else Bext_vec[idim]->_qtyptr->FunctionDof(*Bext_vec[idim],0.,&xyz_refbox._val_dofs[0]); + } - if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); - else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); //======SUM Bhom and Bext //from now on, you'll only use Bmag //Bmag,Bext and Bhom must have the same orders! Math::zeroN(&Bmag._val_dofs[0],Bmag._dim*Bmag._ndof); @@ -223,7 +237,7 @@ using namespace femus; for (uint ivarq=0; ivarq < Bmag._dim; ivarq++) { //ivarq is like idim for (uint d=0; d < Bmag._ndof; d++) { const uint indxq = d + ivarq*Bmag._ndof; - Bmag._val_dofs[indxq] = Bext._val_dofs[indxq] + Bhom_vec[ivarq]->_val_dofs[d]; + Bmag._val_dofs[indxq] = Bext_vec[ivarq]->_val_dofs[d] + Bhom_vec[ivarq]->_val_dofs[d]; } } //======= diff --git a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp index fb57f7da0..cca73b6f8 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp @@ -79,13 +79,28 @@ using namespace femus; CurrentGaussPointBase & currgp = CurrentGaussPointBase::build(currelem,ml_prob.GetQrule(currelem.GetDim())); //=========INTERNAL QUANTITIES (unknowns of the equation) ================== - CurrentQuantity BeOld(currgp); - BeOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYZERO]; - BeOld.VectWithQtyFillBasic(); - BeOld.Allocate(); + CurrentQuantity BextOldX(currgp); + BextOldX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt0"); + BextOldX.VectWithQtyFillBasic(); + BextOldX.Allocate(); + + CurrentQuantity BextOldY(currgp); + BextOldY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt1"); + BextOldY.VectWithQtyFillBasic(); + BextOldY.Allocate(); + + CurrentQuantity BextOldZ(currgp); + BextOldZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt2"); + BextOldZ.VectWithQtyFillBasic(); + BextOldZ.Allocate(); + + std::vector BextOld_vec; + BextOld_vec.push_back(&BextOldX); + BextOld_vec.push_back(&BextOldY); + BextOld_vec.push_back(&BextOldZ); CurrentQuantity LagMultOld(currgp); - LagMultOld._qtyptr = my_system.GetUnknownQuantitiesVector()[QTYONE]; + LagMultOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExtLagMult"); LagMultOld.VectWithQtyFillBasic(); LagMultOld.Allocate(); //========= END INTERNAL QUANTITIES (unknowns of the equation) ================= @@ -217,14 +232,12 @@ using namespace femus; currelem.SetElDofsBc(); - BeOld.GetElemDofs(); - LagMultOld.GetElemDofs(); - for (uint idim=0; idim < space_dim; idim++) { - if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + BextOld_vec[idim]->GetElemDofs(); + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); - if ( VelAdj_vec[idim]->_eqnptr != NULL) VelAdj_vec[idim]->GetElemDofs(); + if ( VelAdj_vec[idim]->_eqnptr != NULL ) VelAdj_vec[idim]->GetElemDofs(); else VelAdj_vec[idim]->_qtyptr->FunctionDof(*VelAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); if ( BhomAdj_vec[idim]->_eqnptr != NULL ) BhomAdj_vec[idim]->GetElemDofs(); else BhomAdj_vec[idim]->_qtyptr->FunctionDof(*BhomAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); @@ -262,7 +275,6 @@ for (uint fe = 0; fe < QL; fe++) { //========preparation for things that are independent of (i,j), dofs of test and shape ===================== BhomAdj_vecQuant.curl_g(); Bhom_vecQuant.curl_g(); - BeOld.val_g(); for (uint idim=0; idimgrad_g(); @@ -288,14 +300,14 @@ for (uint fe = 0; fe < QL; fe++) { //================================= //actually this is used for both QTYZERO and QTYONE, //because the dofs of pressure are FEWER... - for (uint i = 0; i < BeOld._ndof; i++) { + for (uint i = 0; i < BextOldX._ndof; i++) { //============ preparation for (i) ============ //(i) is used only for the RHS or for both MATRIX and RHS //first, you put whatever is related to the Test Functions of THESE rows: //test function value, test function first derivative - const double phii_g = currgp._phi_ndsQLVB_g[BeOld._FEord][i]; - for (uint idim=0; idim_val_g[0] - lambdaDdphii_g*Bhom_vec[idim]->_val_g[0]) //from NS ) - +(1-currelem.GetBCDofFlag()[irowq])*detb*BeOld._val_dofs[irowq]; //Dirichlet bc + +(1-currelem.GetBCDofFlag()[irowq])*detb*BextOld_vec[idim]->_val_dofs[i]; //Dirichlet bc } //============ END QTYZERO rhs ============ for (uint idim=0; idim_val_g[0]*dphiidx_g[idimp1]) + S*phii_g*( -VelAdj_vec[idimp1]->_val_g[0]*dphijdx_g[idim]) @@ -366,7 +378,7 @@ for (uint fe = 0; fe < QL; fe++) { #if (DIMENSION==3) // block +2 [3-4-8] int idimp2=(idim+2)%space_dim; - currelem.Mat()(irowq,j+idimp2*BeOld._ndof) + currelem.Mat()(irowq,j+idimp2*BextOldX._ndof) += currelem.GetBCDofFlag()[irowq]*dtxJxW_g*( + S*phij_g*( -VelAdj_vec[idim]->_val_g[0]*dphiidx_g[idimp2]) + S*phii_g*( -VelAdj_vec[idimp2]->_val_g[0]*dphijdx_g[idim]) @@ -380,9 +392,9 @@ for (uint fe = 0; fe < QL; fe++) { //============ QTYZERO x QTYONE dofs matrix (B^T matrix) // ( p*div(v) ) (NS eq) ============ for (uint j=0; j < LagMultOld._ndof; j++) { const double psij_g = currgp._phi_ndsQLVB_g[LagMultOld._FEord][j]; - const int jclml = j+space_dim*BeOld._ndof; + const int jclml = j+space_dim*BextOldX._ndof; for (uint idim=0; idim Bext_vec; + Bext_vec.push_back(&BextX); + Bext_vec.push_back(&BextY); + Bext_vec.push_back(&BextZ); + + //Bext only to retrieve the dofs //========= auxiliary, must be AFTER Bhom! CurrentQuantity Bmag(currgp); //total @@ -268,15 +284,15 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); pressOld.GetElemDofs(); //=======RETRIEVE the DOFS of the COUPLED QUANTITIES - #if (BMAG_QTY==1) - if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); - else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); for (uint idim=0; idim < space_dim; idim++) { +#if (BMAG_QTY==1) if ( Bhom_vec[idim]->_eqnptr != NULL ) Bhom_vec[idim]->GetElemDofs(); else Bhom_vec[idim]->_qtyptr->FunctionDof(*Bhom_vec[idim],0.,&xyz_refbox._val_dofs[0]); - } + if ( Bext_vec[idim]->_eqnptr != NULL ) Bext_vec[idim]->GetElemDofs(); + else Bext_vec[idim]->_qtyptr->FunctionDof(*Bext_vec[idim],0.,&xyz_refbox._val_dofs[0]); #endif + } //=== the connectivity is only related to the ELEMENT, so it is GEOMETRICAL //===then, the DofMap is RELATED to the EQUATION the Vect comes from! @@ -291,7 +307,7 @@ const int NonStatNS = (int) ml_prob.GetInputParser().get("NonStatNS"); for (uint ivarq=0; ivarq < Bmag._dim; ivarq++) { //ivarq is like idim for (uint d=0; d < Bmag._ndof; d++) { const uint indxq = d + ivarq*Bmag._ndof; - Bmag._val_dofs[indxq] = Bext._val_dofs[indxq] + Bhom_vec[ivarq]->_val_dofs[d]; + Bmag._val_dofs[indxq] = Bext_vec[ivarq]->_val_dofs[d] + Bhom_vec[ivarq]->_val_dofs[d]; } } //=======after summing you EXTEND them to 3D @@ -554,18 +570,10 @@ for (uint fe = 0; fe < QL; fe++) { const uint qtyzero_ord = VelOldX._FEord; const uint qtyzero_ndof = VelOldX._ndof; -//========= CurrentQuantity pressOld(currgp); pressOld._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_Pressure"); pressOld.VectWithQtyFillBasic(); pressOld.Allocate(); - - const uint qtyone_ord = pressOld._FEord; - const uint qtyone_ndof = pressOld._ndof; - - //order - const uint qtyZeroToOne_DofOffset = VelOldX._ndof*space_dim; - //========= END INTERNAL QUANTITIES (unknowns of the equation) ================= //=========EXTERNAL QUANTITIES (couplings) ===== diff --git a/applications/OptimalControl/mhdopt/EqnNSAD.cpp b/applications/OptimalControl/mhdopt/EqnNSAD.cpp index a44680bc6..8832d74d3 100644 --- a/applications/OptimalControl/mhdopt/EqnNSAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnNSAD.cpp @@ -174,12 +174,27 @@ using namespace femus; Bhom_vec.push_back(&BhomZ); //Bhom only to retrieve the dofs - - CurrentQuantity Bext(currgp); - Bext._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt"); - Bext.VectWithQtyFillBasic(); - Bext.Allocate(); + CurrentQuantity BextX(currgp); + BextX._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt0"); + BextX.VectWithQtyFillBasic(); + BextX.Allocate(); + + CurrentQuantity BextY(currgp); + BextY._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt1"); + BextY.VectWithQtyFillBasic(); + BextY.Allocate(); + + CurrentQuantity BextZ(currgp); + BextZ._qtyptr = ml_prob.GetQtyMap().GetQuantity("Qty_MagnFieldExt2"); + BextZ.VectWithQtyFillBasic(); + BextZ.Allocate(); + + std::vector Bext_vec; + Bext_vec.push_back(&BextX); + Bext_vec.push_back(&BextY); + Bext_vec.push_back(&BextZ); + //========= auxiliary, must be AFTER Bhom! //TODO this doesnt have any associated quantity! CurrentQuantity Bmag(currgp); //total Bmag._dim = Bhom_vec.size(); @@ -228,20 +243,20 @@ using namespace femus; currelem.SetElDofsBc(); - if ( Bext._eqnptr != NULL ) Bext.GetElemDofs(); - else Bext._qtyptr->FunctionDof(Bext,0.,&xyz_refbox._val_dofs[0]); for (uint idim=0; idim < space_dim; idim++) { VelAdjOld_vec[idim]->GetElemDofs(); - if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); - else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); //give the Hartmann flow, if not solving NS - if ( VelDes_vec[idim]->_eqnptr != NULL ) VelDes_vec[idim]->GetElemDofs(); - else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],0.,&xyz_refbox._val_dofs[0]); + if ( Vel_vec[idim]->_eqnptr != NULL ) Vel_vec[idim]->GetElemDofs(); + else Vel_vec[idim]->_qtyptr->FunctionDof(*Vel_vec[idim],0.,&xyz_refbox._val_dofs[0]); //give the Hartmann flow, if not solving NS + if ( VelDes_vec[idim]->_eqnptr != NULL ) VelDes_vec[idim]->GetElemDofs(); + else VelDes_vec[idim]->_qtyptr->FunctionDof(*VelDes_vec[idim],0.,&xyz_refbox._val_dofs[0]); if ( BhomAdj_vec[idim]->_eqnptr != NULL ) BhomAdj_vec[idim]->GetElemDofs(); else BhomAdj_vec[idim]->_qtyptr->FunctionDof(*BhomAdj_vec[idim],0.,&xyz_refbox._val_dofs[0]); if ( Bhom_vec[idim]->_eqnptr != NULL ) Bhom_vec[idim]->GetElemDofs(); else Bhom_vec[idim]->_qtyptr->FunctionDof(*Bhom_vec[idim],0.,&xyz_refbox._val_dofs[0]); - } + if ( Bext_vec[idim]->_eqnptr != NULL ) Bext_vec[idim]->GetElemDofs(); + else Bext_vec[idim]->_qtyptr->FunctionDof(*Bext_vec[idim],0.,&xyz_refbox._val_dofs[0]); + } BhomAdj_vecQuant.GetElemDofs(BhomAdj_vec); //this must be AFTER filling the scalar components @@ -254,7 +269,7 @@ using namespace femus; for (uint ivarq=0; ivarq < Bmag._dim; ivarq++) { //ivarq is like idim for (uint d=0; d < Bmag._ndof; d++) { const uint indxq = d + ivarq*Bmag._ndof; - Bmag._val_dofs[indxq] = Bext._val_dofs[indxq] + Bhom_vec[ivarq]->_val_dofs[d]; + Bmag._val_dofs[indxq] = Bext_vec[ivarq]->_val_dofs[d] + Bhom_vec[ivarq]->_val_dofs[d]; } } //======= diff --git a/applications/OptimalControl/mhdopt/OptQuantities.cpp b/applications/OptimalControl/mhdopt/OptQuantities.cpp index 6d66a66a6..10583a6d5 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.cpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.cpp @@ -83,7 +83,23 @@ MagnFieldHomLagMultAdj::MagnFieldHomLagMultAdj(std::string name_in, QuantityMap& } //========================================================================== -MagnFieldExt::MagnFieldExt(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) +MagnFieldExtX::MagnFieldExtX(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) +: Quantity(name_in,qtymap_in,dim_in,FEord_in) { + + for (uint i=0;iget("Bref"); + +} + +//========================================================================== +MagnFieldExtY::MagnFieldExtY(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) +: Quantity(name_in,qtymap_in,dim_in,FEord_in) { + + for (uint i=0;iget("Bref"); + +} + +//========================================================================== +MagnFieldExtZ::MagnFieldExtZ(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in) : Quantity(name_in,qtymap_in,dim_in,FEord_in) { for (uint i=0;iget("Bref"); @@ -447,18 +463,12 @@ void PressureAdj::Function_txyz(const double t, const double* xp,double* func) c //============================================================= //this function receives the x values already in the Reference Box //so no transformation occurs here -void MagnFieldExt::Function_txyz(const double t,const double* xp, double* func) const { - +void MagnFieldExtX::Function_txyz(const double t,const double* xp, double* func) const { - //=====ROTATION of the Function - Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); - const double thetaz = box->_domain_rtmap.get("thetaz"); - - //============== PICK THE REQUIRED REFERENCE VALUES for the FUNCTION const double Bref = _qtymap.GetInputParser()->get("Bref"); //Uref*sqrt(rhof*MUMHD); //in order to make S=1 //function - func[0] = (cos(thetaz)*Bref + func[0] = (Bref /* + 0.*x*x + 0.*y + 0.*(1.-x) @@ -467,20 +477,36 @@ void MagnFieldExt::Function_txyz(const double t,const double* xp, double* func) + 0.*x*x*(x-1.)*(x-1.)*2.*y*(y-1.)*(2.*y-1.) //div=0 + 0.*x*(1.-x)*y*(1.-y)*/ )/Bref; - func[1] = (sin(thetaz)*Bref + +return; +} + + +//============================================================= +//this function receives the x values already in the Reference Box +//so no transformation occurs here +void MagnFieldExtY::Function_txyz(const double t,const double* xp, double* func) const { + + const double Bref = _qtymap.GetInputParser()->get("Bref"); //Uref*sqrt(rhof*MUMHD); //in order to make S=1 + + func[0] = (0. /* + 0.*y - 0.*sin(pi*x)*cos(pi*x)*sin(pi*y)*sin(pi*y) - 0.*y*y*(y-1.)*(y-1.)*2.*x*(x-1.)*(2.*x-1.) //div=0 - 0.*x*(1.-x)*y*(1.-y)*/ )/Bref; -#if (DIMENSION==3) - func[2] = (0.)/Bref; -#endif - - -return; + return; } +//============================================================= +//this function receives the x values already in the Reference Box +//so no transformation occurs here +void MagnFieldExtZ::Function_txyz(const double t,const double* xp, double* func) const { + + func[0] = 0.; + return; + +} @@ -1732,7 +1758,7 @@ if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { //bottom -void MagnFieldExt::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { +void MagnFieldExtX::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { const double bdry_toll = DEFAULT_BDRY_TOLL; @@ -1753,20 +1779,34 @@ Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); -#if (DIMENSION==2) - if ( (x_rotshift[0]) > -bdry_toll && ( x_rotshift[0]) < bdry_toll ) { //left - bc_flag[0]=0; - bc_flag[1]=0; + if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { //left of the RefBox + bc_flag[0]=0; } - if ( (le[0]-lb[0]) -(x_rotshift[0]) > -bdry_toll && (le[0]-lb[0]) -(x_rotshift[0]) < bdry_toll){ //right - bc_flag[0]=0; - bc_flag[1]=0; + if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll){ //right of the RefBox + bc_flag[0]=0; } - if (( x_rotshift[1]) > -bdry_toll && ( x_rotshift[1]) < bdry_toll) { //bottom of the RefBox - bc_flag[0]=0; - bc_flag[1]=0; //here when you control you must fix it,even if the corresponding b is let free, otherwise the control may use this as well + if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll) { //bottom of the RefBox + bc_flag[0]=0; + } + + if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { //top of the RefBox + bc_flag[0] = _qtymap.GetInputParser()->get("UseControl"); + } + if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { + bc_flag[0]=0; + } + if ((le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll) { + bc_flag[0]=0; + } + + return; + +} + + +// bc_flag[1]=0; //here when you control you must fix it,even if the corresponding b is let free, otherwise the control may use this as well //well,wait,it depends: if you are using the Laplacian for MHD state, then Becont bc's must be consistent with the Laplacian // given there. //if you are using curlxcurl, then Becont should be consistent with curl-curl @@ -1777,53 +1817,100 @@ Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); // wait, if you fix all dirichlet, then things go into Becontp pressure //instead if you fix one Dir and one Neu then nothing goes into pressure - } +void MagnFieldExtY::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { - if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) {//top of the of the RefBox - - bc_flag[0] = _qtymap.GetInputParser()->get("UseControl"); - bc_flag[1] = _qtymap.GetInputParser()->get("UseControl"); - } + const double bdry_toll = DEFAULT_BDRY_TOLL; -#else +Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + + std::vector lb(_qtymap.GetMeshTwo()->get_dim()); + std::vector le(_qtymap.GetMeshTwo()->get_dim()); + lb[0] = box->_lb[0]; //already nondimensionalized + le[0] = box->_le[0]; + lb[1] = box->_lb[1]; + le[1] = box->_le[1]; + if (_qtymap.GetMeshTwo()->get_dim() == 3) { + lb[2] = box->_lb[2]; + le[2] = box->_le[2]; + } + + std::vector x_rotshift(_qtymap.GetMeshTwo()->get_dim()); + _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); + + if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { //left of the RefBox bc_flag[0]=0; - bc_flag[1]=0; - bc_flag[2]=0; } - if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll){ //right of the RefBox + if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll) { //right of the RefBox bc_flag[0]=0; - bc_flag[1]=0; - bc_flag[2]=0; } if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll) { //bottom of the RefBox bc_flag[0]=0; - bc_flag[1]=0; - bc_flag[2]=0; } if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { //top of the RefBox bc_flag[0] = _qtymap.GetInputParser()->get("UseControl"); - bc_flag[1] = _qtymap.GetInputParser()->get("UseControl"); - - bc_flag[2]=0; } if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { bc_flag[0]=0; - bc_flag[1]=0; - bc_flag[2]=0; } if ((le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll) { bc_flag[0]=0; - bc_flag[1]=0; - bc_flag[2]=0; } -#endif //DIMENSION + + return; + +} + + +void MagnFieldExtZ::bc_flag_txyz(const double t, const double* xp, std::vector & bc_flag) const { + + const double bdry_toll = DEFAULT_BDRY_TOLL; + +Box* box = static_cast(_qtymap.GetMeshTwo()->GetDomain()); + + std::vector lb(_qtymap.GetMeshTwo()->get_dim()); + std::vector le(_qtymap.GetMeshTwo()->get_dim()); + lb[0] = box->_lb[0]; //already nondimensionalized + le[0] = box->_le[0]; + lb[1] = box->_lb[1]; + le[1] = box->_le[1]; + if (_qtymap.GetMeshTwo()->get_dim() == 3) { + lb[2] = box->_lb[2]; + le[2] = box->_le[2]; + } + + std::vector x_rotshift(_qtymap.GetMeshTwo()->get_dim()); + _qtymap.GetMeshTwo()->_domain->TransformPointToRef(xp,&x_rotshift[0]); + + + if ( x_rotshift[0] > -bdry_toll && x_rotshift[0] < bdry_toll ) { //left of the RefBox + bc_flag[0]=0; + } + + if ( (le[0]-lb[0]) - x_rotshift[0] > -bdry_toll && (le[0]-lb[0]) - x_rotshift[0] < bdry_toll){ //right of the RefBox + bc_flag[0]=0; + } + + if ( x_rotshift[1] > -bdry_toll && x_rotshift[1] < bdry_toll) { //bottom of the RefBox + bc_flag[0]=0; + } + + if ((le[1]-lb[1]) -(x_rotshift[1]) > -bdry_toll && (le[1]-lb[1]) -(x_rotshift[1]) < bdry_toll) { //top of the RefBox + + bc_flag[0]=0; + } + if ( (x_rotshift[2]) > -bdry_toll && ( x_rotshift[2]) < bdry_toll ) { + bc_flag[0]=0; + } + if ((le[2]-lb[2]) -(x_rotshift[2]) > -bdry_toll && (le[2]-lb[2]) -(x_rotshift[2]) < bdry_toll) { + bc_flag[0]=0; + } return; @@ -2085,20 +2172,35 @@ void MagnFieldHomLagMultAdj::initialize_xyz(const double* xp, std::vector< doubl return; } -void MagnFieldExt::initialize_xyz(const double* xp, std::vector< double >& value) const { +void MagnFieldExtX::initialize_xyz(const double* xp, std::vector< double >& value) const { const double Bref = _qtymap.GetInputParser()->get("Bref"); value[0] = Bref/Bref; - value[1] = 0./Bref; -#if (DIMENSION==3) - value[2] = 0./Bref; -#endif - return; } + +void MagnFieldExtY::initialize_xyz(const double* xp, std::vector< double >& value) const { + + const double Bref = _qtymap.GetInputParser()->get("Bref"); + + value[0] = 0./Bref; + + return; +} + +void MagnFieldExtZ::initialize_xyz(const double* xp, std::vector< double >& value) const { + + const double Bref = _qtymap.GetInputParser()->get("Bref"); + + value[0] = 0./Bref; + + return; +} + + void MagnFieldExtLagMult::initialize_xyz(const double* xp, std::vector< double >& value) const { const double Uref = _qtymap.GetInputParser()->get("Uref"); diff --git a/applications/OptimalControl/mhdopt/OptQuantities.hpp b/applications/OptimalControl/mhdopt/OptQuantities.hpp index 8ffaba7e6..a0be0eaef 100644 --- a/applications/OptimalControl/mhdopt/OptQuantities.hpp +++ b/applications/OptimalControl/mhdopt/OptQuantities.hpp @@ -91,11 +91,37 @@ class MagnFieldHomAdjZ : public Quantity { }; -class MagnFieldExt : public Quantity { +class MagnFieldExtX : public Quantity { public: - MagnFieldExt(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + MagnFieldExtX(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; + void initialize_xyz(const double* xp, std::vector & value) const; + + +}; + +class MagnFieldExtY : public Quantity { + + public: + + MagnFieldExtY(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); + + void Function_txyz(const double t, const double* xp,double* temp) const; + void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; + void initialize_xyz(const double* xp, std::vector & value) const; + + +}; + +class MagnFieldExtZ : public Quantity { + + public: + + MagnFieldExtZ(std::string name_in, QuantityMap& qtymap_in, uint dim_in, uint FEord_in); void Function_txyz(const double t, const double* xp,double* temp) const; void bc_flag_txyz(const double t, const double* xp, std::vector & flag) const; diff --git a/applications/OptimalControl/mhdopt/main.cpp b/applications/OptimalControl/mhdopt/main.cpp index 983087b53..fc3965339 100644 --- a/applications/OptimalControl/mhdopt/main.cpp +++ b/applications/OptimalControl/mhdopt/main.cpp @@ -130,8 +130,10 @@ int main(int argc, char** argv) { MagnFieldHomY bhomY("Qty_MagnFieldHom1",qty_map,1,QQ); qty_map.AddQuantity(&bhomY); MagnFieldHomZ bhomZ("Qty_MagnFieldHom2",qty_map,1,QQ); qty_map.AddQuantity(&bhomZ); - MagnFieldExt Bext("Qty_MagnFieldExt",qty_map,mesh.get_dim(),QQ); qty_map.AddQuantity(&Bext); - + MagnFieldExtX BextX("Qty_MagnFieldExt0",qty_map,1,QQ); qty_map.AddQuantity(&BextX); + MagnFieldExtY BextY("Qty_MagnFieldExt1",qty_map,1,QQ); qty_map.AddQuantity(&BextY); + MagnFieldExtZ BextZ("Qty_MagnFieldExt2",qty_map,1,QQ); qty_map.AddQuantity(&BextZ); + MagnFieldHomLagMult bhom_lag_mult("Qty_MagnFieldHomLagMult",qty_map,1,LL); qty_map.AddQuantity(&bhom_lag_mult); MagnFieldExtLagMult Bext_lag_mult("Qty_MagnFieldExtLagMult",qty_map,1,LL); qty_map.AddQuantity(&Bext_lag_mult); MagnFieldHomLagMultAdj bhom_lag_mult_adj("Qty_MagnFieldHomLagMultAdj",qty_map,1,LL); qty_map.AddQuantity(&bhom_lag_mult_adj); @@ -256,8 +258,10 @@ int main(int argc, char** argv) { eqnMHDCONT.AddSolutionToSystemPDEVector(ml_msh.GetDimension(),"Qty_MagnFieldExt"); eqnMHDCONT.AddSolutionToSystemPDE("Qty_MagnFieldExtLagMult"); - eqnMHDCONT.AddUnknownToSystemPDE(&Bext); - eqnMHDCONT.AddUnknownToSystemPDE(&Bext_lag_mult); + eqnMHDCONT.AddUnknownToSystemPDE(&BextX); + eqnMHDCONT.AddUnknownToSystemPDE(&BextY); + eqnMHDCONT.AddUnknownToSystemPDE(&BextZ); + eqnMHDCONT.AddUnknownToSystemPDE(&Bext_lag_mult); eqnMHDCONT.SetAssembleFunction(GenMatRhsMHDCONT); #endif From c4833819eca537e1041e0fdc03c589f722a30371 Mon Sep 17 00:00:00 2001 From: Giorgio Bornia Date: Wed, 8 Apr 2015 23:16:25 -0500 Subject: [PATCH 19/19] Removed QtyEnum --- applications/OptimalControl/fe_test/EqnT.cpp | 1 - applications/OptimalControl/fe_test/main.cpp | 1 - applications/OptimalControl/mhdopt/EqnMHD.cpp | 1 - applications/OptimalControl/mhdopt/EqnMHDAD.cpp | 1 - applications/OptimalControl/mhdopt/EqnMHDCONT.cpp | 1 - applications/OptimalControl/mhdopt/EqnNS.cpp | 1 - applications/OptimalControl/mhdopt/EqnNSAD.cpp | 1 - applications/OptimalControl/mhdopt/main.cpp | 1 - applications/OptimalControl/tempopt/EqnNS.cpp | 1 - applications/OptimalControl/tempopt/EqnT.cpp | 1 - applications/OptimalControl/tempopt/main.cpp | 1 - src/enums/QTYnumEnum.hpp | 8 -------- src/equations/SystemTwo.cpp | 1 - 13 files changed, 20 deletions(-) delete mode 100644 src/enums/QTYnumEnum.hpp diff --git a/applications/OptimalControl/fe_test/EqnT.cpp b/applications/OptimalControl/fe_test/EqnT.cpp index 07a3ed3af..7581d4ca2 100644 --- a/applications/OptimalControl/fe_test/EqnT.cpp +++ b/applications/OptimalControl/fe_test/EqnT.cpp @@ -14,7 +14,6 @@ #include "NormTangEnum.hpp" #include "VBTypeEnum.hpp" #include "GeomElTypeEnum.hpp" -#include "QTYnumEnum.hpp" #include "Domain.hpp" #include "TimeLoop.hpp" #include "CurrentGaussPoint.hpp" diff --git a/applications/OptimalControl/fe_test/main.cpp b/applications/OptimalControl/fe_test/main.cpp index 2be1a06b3..3238609b0 100644 --- a/applications/OptimalControl/fe_test/main.cpp +++ b/applications/OptimalControl/fe_test/main.cpp @@ -19,7 +19,6 @@ #include "TimeLoop.hpp" #include "Typedefs.hpp" #include "Quantity.hpp" -#include "QTYnumEnum.hpp" #include "Box.hpp" //for the DOMAIN #include "LinearEquationSolver.hpp" #include "XDMFWriter.hpp" diff --git a/applications/OptimalControl/mhdopt/EqnMHD.cpp b/applications/OptimalControl/mhdopt/EqnMHD.cpp index 5bf13cdb4..19a96f739 100644 --- a/applications/OptimalControl/mhdopt/EqnMHD.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHD.cpp @@ -13,7 +13,6 @@ #include "FETypeEnum.hpp" #include "GeomElTypeEnum.hpp" #include "NormTangEnum.hpp" -#include "QTYnumEnum.hpp" #include "TimeLoop.hpp" diff --git a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp index fb99c317e..4ee305bf0 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDAD.cpp @@ -14,7 +14,6 @@ #include "FETypeEnum.hpp" #include "GeomElTypeEnum.hpp" #include "NormTangEnum.hpp" -#include "QTYnumEnum.hpp" #include "TimeLoop.hpp" #include "CurrentGaussPoint.hpp" diff --git a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp index cca73b6f8..026d07171 100644 --- a/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp +++ b/applications/OptimalControl/mhdopt/EqnMHDCONT.cpp @@ -15,7 +15,6 @@ #include "NormTangEnum.hpp" #include "GeomElTypeEnum.hpp" #include "Quantity.hpp" -#include "QTYnumEnum.hpp" #include "TimeLoop.hpp" #include "CurrentGaussPoint.hpp" #include "CurrentElem.hpp" diff --git a/applications/OptimalControl/mhdopt/EqnNS.cpp b/applications/OptimalControl/mhdopt/EqnNS.cpp index f556c4403..6f26de213 100644 --- a/applications/OptimalControl/mhdopt/EqnNS.cpp +++ b/applications/OptimalControl/mhdopt/EqnNS.cpp @@ -14,7 +14,6 @@ #include "NormTangEnum.hpp" #include "VBTypeEnum.hpp" #include "GeomElTypeEnum.hpp" -#include "QTYnumEnum.hpp" #include "Domain.hpp" #include "TimeLoop.hpp" #include "CurrentGaussPoint.hpp" diff --git a/applications/OptimalControl/mhdopt/EqnNSAD.cpp b/applications/OptimalControl/mhdopt/EqnNSAD.cpp index 8832d74d3..750ce90ea 100644 --- a/applications/OptimalControl/mhdopt/EqnNSAD.cpp +++ b/applications/OptimalControl/mhdopt/EqnNSAD.cpp @@ -13,7 +13,6 @@ #include "GeomElTypeEnum.hpp" #include "NormTangEnum.hpp" #include "Quantity.hpp" -#include "QTYnumEnum.hpp" #include "TimeLoop.hpp" #include "CurrentGaussPoint.hpp" #include "CurrentElem.hpp" diff --git a/applications/OptimalControl/mhdopt/main.cpp b/applications/OptimalControl/mhdopt/main.cpp index fc3965339..0249b568e 100644 --- a/applications/OptimalControl/mhdopt/main.cpp +++ b/applications/OptimalControl/mhdopt/main.cpp @@ -20,7 +20,6 @@ #include "Typedefs.hpp" #include "CmdLine.hpp" #include "Quantity.hpp" -#include "QTYnumEnum.hpp" #include "Box.hpp" //for the DOMAIN #include "XDMFWriter.hpp" diff --git a/applications/OptimalControl/tempopt/EqnNS.cpp b/applications/OptimalControl/tempopt/EqnNS.cpp index d2e06a4f7..69b3e45ac 100644 --- a/applications/OptimalControl/tempopt/EqnNS.cpp +++ b/applications/OptimalControl/tempopt/EqnNS.cpp @@ -14,7 +14,6 @@ #include "NormTangEnum.hpp" #include "VBTypeEnum.hpp" #include "GeomElTypeEnum.hpp" -#include "QTYnumEnum.hpp" #include "Domain.hpp" #include "CurrentGaussPoint.hpp" #include "CurrentElem.hpp" diff --git a/applications/OptimalControl/tempopt/EqnT.cpp b/applications/OptimalControl/tempopt/EqnT.cpp index e2c1bfe51..f3aa869a5 100644 --- a/applications/OptimalControl/tempopt/EqnT.cpp +++ b/applications/OptimalControl/tempopt/EqnT.cpp @@ -19,7 +19,6 @@ #include "NormTangEnum.hpp" #include "VBTypeEnum.hpp" #include "GeomElTypeEnum.hpp" -#include "QTYnumEnum.hpp" #include "Domain.hpp" #include "TimeLoop.hpp" #include "CurrentGaussPoint.hpp" diff --git a/applications/OptimalControl/tempopt/main.cpp b/applications/OptimalControl/tempopt/main.cpp index 3e23c5ac8..1fef62eeb 100644 --- a/applications/OptimalControl/tempopt/main.cpp +++ b/applications/OptimalControl/tempopt/main.cpp @@ -18,7 +18,6 @@ #include "TimeLoop.hpp" #include "Typedefs.hpp" #include "Quantity.hpp" -#include "QTYnumEnum.hpp" #include "Box.hpp" //for the DOMAIN #include "XDMFWriter.hpp" diff --git a/src/enums/QTYnumEnum.hpp b/src/enums/QTYnumEnum.hpp deleted file mode 100644 index dcf3b9c6e..000000000 --- a/src/enums/QTYnumEnum.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __femus_enums_QTYnumEnum_hpp__ -#define __femus_enums_QTYnumEnum_hpp__ - -enum QTYnum {QTYZERO=0, - QTYONE }; - - -#endif \ No newline at end of file diff --git a/src/equations/SystemTwo.cpp b/src/equations/SystemTwo.cpp index 4a28643ff..73b1c93cc 100644 --- a/src/equations/SystemTwo.cpp +++ b/src/equations/SystemTwo.cpp @@ -29,7 +29,6 @@ #include "MgSmootherEnum.hpp" #include "NormTangEnum.hpp" -#include "QTYnumEnum.hpp" #include "XDMFWriter.hpp" #include "MultiLevelMeshTwo.hpp" #include "MultiLevelProblem.hpp"