From 2a0100dd5a6ba16a38a9cf4cd080aecc5db86b11 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 5 Aug 2019 14:07:11 +0100 Subject: [PATCH 01/82] Initial implementation for dynamic FSI adjoints --- Common/src/geometry_structure.cpp | 21 +- Common/src/grid_movement_structure.cpp | 24 ++- SU2_CFD/src/SU2_CFD.cpp | 6 +- SU2_CFD/src/drivers/CDriver.cpp | 53 ++--- SU2_CFD/src/iteration_structure.cpp | 11 +- .../numerics_direct_elasticity_nonlinear.cpp | 1 + SU2_CFD/src/output_structure.cpp | 31 ++- SU2_CFD/src/solver_adjoint_elasticity.cpp | 192 +++++++++++++++++- SU2_CFD/src/solver_direct_elasticity.cpp | 10 +- SU2_CFD/src/solver_direct_mean.cpp | 2 +- SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp | 1 + SU2_DOT/src/SU2_DOT.cpp | 1 + SU2_PY/SU2/eval/functions.py | 12 +- SU2_PY/SU2/eval/gradients.py | 20 +- SU2_PY/SU2/io/tools.py | 28 ++- SU2_PY/SU2/opt/project.py | 15 +- SU2_PY/SU2/run/adjoint.py | 15 +- SU2_PY/SU2/run/direct.py | 9 +- SU2_PY/SU2/run/projection.py | 5 +- SU2_PY/shape_optimization.py | 18 +- 20 files changed, 393 insertions(+), 82 deletions(-) diff --git a/Common/src/geometry_structure.cpp b/Common/src/geometry_structure.cpp index f60f698709ed..35033fdd6e47 100644 --- a/Common/src/geometry_structure.cpp +++ b/Common/src/geometry_structure.cpp @@ -2678,10 +2678,12 @@ void CGeometry::ComputeAirfoil_Section(su2double *Plane_P0, su2double *Plane_Nor void CGeometry::RegisterCoordinates(CConfig *config) { unsigned short iDim; unsigned long iPoint; - + cout << "CVC: Debug: nPoint = " << nPoint << endl; + cout << "CVC: Debug: nDim = " << nDim << endl; for (iPoint = 0; iPoint < nPoint; iPoint++) { for (iDim = 0; iDim < nDim; iDim++) { AD::RegisterInput(node[iPoint]->GetCoord()[iDim]); + if (iPoint == 0 && iDim == 0) cout << "CVC: Debug: node[" << iPoint << "] coord[" << iDim << "] = " << node[iPoint]->GetCoord()[iDim] << endl; } } } @@ -16043,7 +16045,7 @@ void CPhysicalGeometry::SetSensitivity(CConfig *config) { Sensitivity = new su2double[nPoint*nDim]; - if (config->GetUnsteady_Simulation()) { + if ((config->GetUnsteady_Simulation()) || (config->GetDynamic_Analysis() == DYNAMIC)) { nExtIter = config->GetnExtIter(); }else { nExtIter = 1; @@ -16084,13 +16086,17 @@ void CPhysicalGeometry::SetSensitivity(CConfig *config) { filename = config->GetObjFunc_Extension(filename); - if (config->GetUnsteady_Simulation()) { + if (config->GetnZone() > 1){ + filename = config->GetMultizone_FileName(filename, config->GetiZone()); + } + + if ((config->GetUnsteady_Simulation()) || (config->GetDynamic_Analysis() == DYNAMIC)) { filename = config->GetUnsteady_FileName(filename, nExtIter-1); } - if (config->GetnZone() > 1){ + /*if (config->GetnZone() > 1){ filename = config->GetMultizone_FileName(filename, config->GetiZone()); - } + }*/ if (config->GetRead_Binary_Restart()) { @@ -16372,7 +16378,10 @@ void CPhysicalGeometry::SetSensitivity(CConfig *config) { /*--- We need to store this point's data, so jump to the correct offset in the buffer of data from the restart file and load it. ---*/ - + //Dyn nFields=10, Sta nFields=6 + if (config->GetDynamic_Analysis() == DYNAMIC) skipVar = 4; + else skipVar = nFields*2/3; + //CVC: Temporary correction : New index to get sensitivity from both compressible flow and structural adjoint solution files index = counter*nFields + skipVar; for (iDim = 0; iDim < nDim; iDim++) Sensitivity[iPoint_Local*nDim+iDim] = Restart_Data[index+iDim]; diff --git a/Common/src/grid_movement_structure.cpp b/Common/src/grid_movement_structure.cpp index e3e807630597..159c5c1ee387 100644 --- a/Common/src/grid_movement_structure.cpp +++ b/Common/src/grid_movement_structure.cpp @@ -438,10 +438,12 @@ void CVolumetricMovement::ComputeSolid_Wall_Distance(CGeometry *geometry, CConfi nVertex_SolidWall = 0; for(iMarker=0; iMarkerGetnMarker_All(); ++iMarker) { - if( (config->GetMarker_All_KindBC(iMarker) == EULER_WALL || - config->GetMarker_All_KindBC(iMarker) == HEAT_FLUX) || - (config->GetMarker_All_KindBC(iMarker) == ISOTHERMAL) || - (config->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE)) { + if( (config->GetMarker_All_KindBC(iMarker) == EULER_WALL) || + (config->GetMarker_All_KindBC(iMarker) == HEAT_FLUX) || + (config->GetMarker_All_KindBC(iMarker) == ISOTHERMAL) || + (config->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE) || + (config->GetMarker_All_KindBC(iMarker) == CLAMPED_BOUNDARY ) || + (config->GetMarker_All_KindBC(iMarker) == LOAD_BOUNDARY )) { nVertex_SolidWall += geometry->GetnVertex(iMarker); } } @@ -457,10 +459,12 @@ void CVolumetricMovement::ComputeSolid_Wall_Distance(CGeometry *geometry, CConfi ii = 0; jj = 0; for (iMarker=0; iMarkerGetnMarker_All(); ++iMarker) { - if ( (config->GetMarker_All_KindBC(iMarker) == EULER_WALL || - config->GetMarker_All_KindBC(iMarker) == HEAT_FLUX) || - (config->GetMarker_All_KindBC(iMarker) == ISOTHERMAL) || - (config->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE)) { + if ( (config->GetMarker_All_KindBC(iMarker) == EULER_WALL) || + (config->GetMarker_All_KindBC(iMarker) == HEAT_FLUX) || + (config->GetMarker_All_KindBC(iMarker) == ISOTHERMAL) || + (config->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE) || + (config->GetMarker_All_KindBC(iMarker) == CLAMPED_BOUNDARY ) || + (config->GetMarker_All_KindBC(iMarker) == LOAD_BOUNDARY )) { for (iVertex=0; iVertexGetnVertex(iMarker); ++iVertex) { iPoint = geometry->vertex[iMarker][iVertex]->GetNode(); PointIDs[jj++] = iPoint; @@ -1810,7 +1814,9 @@ void CVolumetricMovement::UpdateGridCoord_Derivatives(CGeometry *geometry, CConf if((config->GetMarker_All_KindBC(iMarker) == HEAT_FLUX ) || (config->GetMarker_All_KindBC(iMarker) == EULER_WALL ) || (config->GetMarker_All_KindBC(iMarker) == ISOTHERMAL ) || - (config->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE)) { + (config->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE) || + (config->GetMarker_All_KindBC(iMarker) == CLAMPED_BOUNDARY ) || + (config->GetMarker_All_KindBC(iMarker) == LOAD_BOUNDARY )) { for (iVertex = 0; iVertex < geometry->nVertex[iMarker]; iVertex++) { iPoint = geometry->vertex[iMarker][iVertex]->GetNode(); if (geometry->node[iPoint]->GetDomain()) { diff --git a/SU2_CFD/src/SU2_CFD.cpp b/SU2_CFD/src/SU2_CFD.cpp index 1592ef946431..6dbb963fc13c 100644 --- a/SU2_CFD/src/SU2_CFD.cpp +++ b/SU2_CFD/src/SU2_CFD.cpp @@ -132,12 +132,12 @@ int main(int argc, char *argv[]) { /*--- If the problem is a discrete adjoint FSI problem ---*/ if (disc_adj_fsi) { - if (stat_fsi) { + //if (stat_fsi) { driver = new CDiscAdjFSIDriver(config_file_name, nZone, MPICommunicator); - } + /*} else { SU2_MPI::Error("WARNING: There is no discrete adjoint implementation for dynamic FSI. ", CURRENT_FUNCTION); - } + }*/ } /*--- If the problem is a direct FSI problem ---*/ else{ diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index d4fa4ec956bd..8353707886d9 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -5426,27 +5426,27 @@ CDiscAdjFSIDriver::CDiscAdjFSIDriver(char* confFile, ofstream myfile_res; myfile_res.open ("history_adjoint_FSI.csv"); - myfile_res << "BGS_Iter\t"; + myfile_res << "BGS_Iter"; for (iVar = 0; iVar < nVar_Flow; iVar++){ - myfile_res << "ResFlow[" << iVar << "]\t"; + myfile_res << ", " << "ResFlow[" << iVar << "]"; } for (iVar = 0; iVar < nVar_Struct; iVar++){ - myfile_res << "ResFEA[" << iVar << "]\t"; + myfile_res << ", " << "ResFEA[" << iVar << "]"; } bool de_effects = config_container[ZONE_0]->GetDE_Effects(); for (iVar = 0; iVar < config_container[ZONE_0]->GetnElasticityMod(); iVar++) - myfile_res << "Sens_E_" << iVar << "\t"; + myfile_res << ", " << "Sens_E_" << iVar; for (iVar = 0; iVar < config_container[ZONE_0]->GetnPoissonRatio(); iVar++) - myfile_res << "Sens_Nu_" << iVar << "\t"; + myfile_res << ", " << "Sens_Nu_" << iVar; if (de_effects){ for (iVar = 0; iVar < config_container[ZONE_0]->GetnElectric_Field(); iVar++) - myfile_res << "Sens_EField_" << iVar << "\t"; + myfile_res << ", " << "Sens_EField_" << iVar; } myfile_res << endl; @@ -5497,8 +5497,8 @@ CDiscAdjFSIDriver::CDiscAdjFSIDriver(char* confFile, } /*--- TODO: This is a workaround until the TestCases.py script incorporates new classes for nested loops. ---*/ - config_container[ZONE_0]->SetnExtIter(1); - config_container[ZONE_1]->SetnExtIter(1); + if (config_container[ZONE_0]->GetUnsteady_Simulation() == NONE) config_container[ZONE_0]->SetnExtIter(1); + if (config_container[ZONE_1]->GetDynamic_Analysis() != DYNAMIC) config_container[ZONE_1]->SetnExtIter(1); } @@ -5535,7 +5535,7 @@ void CDiscAdjFSIDriver::Run( ) { unsigned long nOuterIter = config_container[ZONE_FLOW]->GetnIterFSI(); ofstream myfile_struc, myfile_flow, myfile_geo; - + Preprocess(ZONE_FLOW, ZONE_STRUCT, ALL_VARIABLES); @@ -5661,9 +5661,12 @@ void CDiscAdjFSIDriver::Preprocess(unsigned short ZONE_FLOW, if ((ExtIter > 0) && dual_time){ - /*--- Load solution timestep n - 2 ---*/ - - iteration_container[ZONE_FLOW][INST_0]->LoadUnsteady_Solution(geometry_container, solver_container,config_container, ZONE_FLOW, INST_0, Direct_Iter_Flow - 2); + /*--- Load solution timestep n-1 | n-2 for DualTimestepping 1st | 2nd order ---*/ + if (dual_time_1st){ + iteration_container[ZONE_FLOW][INST_0]->LoadUnsteady_Solution(geometry_container, solver_container,config_container, ZONE_FLOW, INST_0, Direct_Iter_Flow - 1); + } else { + iteration_container[ZONE_FLOW][INST_0]->LoadUnsteady_Solution(geometry_container, solver_container,config_container, ZONE_FLOW, INST_0, Direct_Iter_Flow - 2); + } /*--- Temporarily store the loaded solution in the Solution_Old array ---*/ @@ -5690,9 +5693,9 @@ void CDiscAdjFSIDriver::Preprocess(unsigned short ZONE_FLOW, /*--- Set Solution at timestep n-1 to the previously loaded solution ---*/ for (iMesh=0; iMesh<=config_container[ZONE_FLOW]->GetnMGLevels();iMesh++) { for(iPoint=0; iPointGetnPoint();iPoint++) { - solver_container[ZONE_FLOW][INST_0][iMesh][FLOW_SOL]->node[iPoint]->Set_Solution_time_n(solver_container[ZONE_FLOW][INST_0][iMesh][FLOW_SOL]->node[iPoint]->GetSolution_time_n1()); + solver_container[ZONE_FLOW][INST_0][iMesh][FLOW_SOL]->node[iPoint]->Set_Solution_time_n(solver_container[ZONE_FLOW][INST_0][iMesh][FLOW_SOL]->node[iPoint]->GetSolution_Old()); if (turbulent) { - solver_container[ZONE_FLOW][INST_0][iMesh][TURB_SOL]->node[iPoint]->Set_Solution_time_n(solver_container[ZONE_FLOW][INST_0][iMesh][TURB_SOL]->node[iPoint]->GetSolution_time_n1()); + solver_container[ZONE_FLOW][INST_0][iMesh][TURB_SOL]->node[iPoint]->Set_Solution_time_n(solver_container[ZONE_FLOW][INST_0][iMesh][TURB_SOL]->node[iPoint]->GetSolution_Old()); } } } @@ -5724,6 +5727,7 @@ void CDiscAdjFSIDriver::Preprocess(unsigned short ZONE_FLOW, /*--- Load the restart (we need to use the routine in order to get the GEOMETRY, otherwise it's restarted from the base mesh ---*/ solver_container[ZONE_FLOW][INST_0][MESH_0][FLOW_SOL]->LoadRestart(geometry_container[ZONE_FLOW][INST_0], solver_container[ZONE_FLOW][INST_0], config_container[ZONE_FLOW], 0, true); + } if (ExtIter == 0 || dual_time) { @@ -5745,7 +5749,6 @@ void CDiscAdjFSIDriver::Preprocess(unsigned short ZONE_FLOW, solver_container[ZONE_FLOW][INST_0][MESH_0][ADJFLOW_SOL]->node[iPoint]->SetGeometry_Direct(geometry_container[ZONE_FLOW][INST_0][MESH_0]->node[iPoint]->GetCoord()); } - } /*----------------------------------------------------------------------------*/ /*-------------------------- STRUCTURAL SOLUTION -----------------------------*/ @@ -6128,9 +6131,9 @@ void CDiscAdjFSIDriver::SetRecording(unsigned short ZONE_FLOW, string kind_DirectIteration = " "; string kind_AdjointIteration = " "; - if (unsteady || dynamic){ + /*if (unsteady || dynamic){ SU2_MPI::Error("DYNAMIC ADJOINT SOLVER NOT IMPLEMENTED FOR FSI APPLICATIONS", CURRENT_FUNCTION); - } + }*/ if (rank == MASTER_NODE){ @@ -6719,8 +6722,8 @@ bool CDiscAdjFSIDriver::BGSConvergence(unsigned long IntIter, flow_converged_absolute = ((residual_flow[0] < flow_criteria) && (residual_flow[nVar_Flow-1] < flow_criteria)); flow_converged_relative = ((residual_flow_rel[0] > flow_criteria_rel) && (residual_flow_rel[nVar_Flow-1] > flow_criteria_rel)); - struct_converged_absolute = ((residual_struct[0] < structure_criteria) && (residual_struct[nVar_Flow-1] < structure_criteria)); - struct_converged_relative = ((residual_struct_rel[0] > structure_criteria_rel) && (residual_struct_rel[nVar_Flow-1] > structure_criteria_rel)); + struct_converged_absolute = ((residual_struct[0] < structure_criteria) && (residual_struct[nVar_Struct-1] < structure_criteria)); + struct_converged_relative = ((residual_struct_rel[0] > structure_criteria_rel) && (residual_struct_rel[nVar_Struct-1] > structure_criteria_rel)); Convergence = ((flow_converged_absolute && struct_converged_absolute) || (flow_converged_absolute && struct_converged_relative) || @@ -6757,25 +6760,25 @@ bool CDiscAdjFSIDriver::BGSConvergence(unsigned long IntIter, myfile_res.open ("history_adjoint_FSI.csv", ios::app); - myfile_res << IntIter << "\t"; + myfile_res << IntIter; myfile_res.precision(15); for (iVar = 0; iVar < nVar_Flow; iVar++){ - myfile_res << fixed << residual_flow[iVar] << "\t"; + myfile_res << fixed << ", " << residual_flow[iVar]; } for (iVar = 0; iVar < nVar_Struct; iVar++){ - myfile_res << fixed << residual_struct[iVar] << "\t"; + myfile_res << fixed << ", " << residual_struct[iVar]; } for (iVar = 0; iVar < config_container[ZONE_STRUCT]->GetnElasticityMod(); iVar++) - myfile_res << scientific << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_E(iVar) << "\t"; + myfile_res << scientific << ", " << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_E(iVar); for (iVar = 0; iVar < config_container[ZONE_STRUCT]->GetnPoissonRatio(); iVar++) - myfile_res << scientific << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_Nu(iVar) << "\t"; + myfile_res << scientific << ", " << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_Nu(iVar); if (de_effects){ for (iVar = 0; iVar < config_container[ZONE_STRUCT]->GetnElectric_Field(); iVar++) - myfile_res << scientific << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_EField(0) << "\t"; + myfile_res << scientific << ", " << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_EField(0); } myfile_res << endl; diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index bdae734f1f79..b49e92d24d87 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -278,7 +278,10 @@ void CIteration::SetGrid_Movement(CGeometry **geometry, nIterMesh = grid_movement->Get_nIterMesh(); stat_mesh = (nIterMesh == 0); - if (!adjoint && !stat_mesh) { + //CVC: Debug: + //if (!adjoint && !stat_mesh) { + //CVC: Debug: Are the grid velocities from the direct solution stored and handled correctly? + if (!discrete_adjoint && !stat_mesh) { if (rank == MASTER_NODE && Screen_Output) cout << "Computing grid velocities by finite differencing." << endl; geometry[MESH_0]->SetGridVelocity(config, ExtIter); @@ -1502,7 +1505,7 @@ void CFEAIteration::Iterate(COutput *output, /*----------------- If the solver is non-linear, we need to subiterate using a Newton-Raphson approach ----------------------*/ for (IntIter = 1; IntIter < config[val_iZone]->GetDyn_nIntIter(); IntIter++) { - +if ((rank == MASTER_NODE) && disc_adj_fem) cout << "CVC: Debug: CFEAIteration::Iterate Restricted to 1 iteration for AD problems" << endl; /*--- Limits to only one structural iteration for the discrete adjoint FEM problem ---*/ if (disc_adj_fem) break; @@ -3102,6 +3105,10 @@ void CDiscAdjFEAIteration::SetDependencies(CSolver *****solver, CGeometry ****ge } + // CVC: Debug: /*--- Add dependencies for grid coordinate derivatives, no need for full update as the structural solver only uses the node coordinates. ---*/ + + // geometry[iZone][iInst][MESH_0]->Set_MPI_Coord(config[iZone]); + } void CDiscAdjFEAIteration::RegisterOutput(CSolver *****solver, CGeometry ****geometry, CConfig **config, unsigned short iZone, unsigned short iInst){ diff --git a/SU2_CFD/src/numerics_direct_elasticity_nonlinear.cpp b/SU2_CFD/src/numerics_direct_elasticity_nonlinear.cpp index b4efb8924738..573da8c157d3 100644 --- a/SU2_CFD/src/numerics_direct_elasticity_nonlinear.cpp +++ b/SU2_CFD/src/numerics_direct_elasticity_nonlinear.cpp @@ -345,6 +345,7 @@ void CFEANonlinearElasticity::Compute_Tangent_Matrix(CElement *element, CConfig GradNi_Ref_Mat[iNode][iDim] = element->GetGradNi_X(iNode,iGauss,iDim); GradNi_Curr_Mat[iNode][iDim] = element->GetGradNi_x(iNode,iGauss,iDim); currentCoord[iNode][iDim] = element->GetCurr_Coord(iNode, iDim); + //cout << "CVC: Debug: currentCoord[" << iNode << "][" << iDim << "] = " << currentCoord[iNode][iDim] << endl; } /*--- Compute the deformation gradient ---*/ diff --git a/SU2_CFD/src/output_structure.cpp b/SU2_CFD/src/output_structure.cpp index ba2623996f79..1e09ecf45096 100644 --- a/SU2_CFD/src/output_structure.cpp +++ b/SU2_CFD/src/output_structure.cpp @@ -11345,7 +11345,7 @@ void COutput::SpecialOutput_FSI(ofstream *FSIHist_file, CGeometry ****geometry, case EULER : case NAVIER_STOKES: case RANS : FSIHist_file[0] << flow_resid; - if (turbulent) FSIHist_file[0] << turb_resid; + //if (turbulent) FSIHist_file[0] << turb_resid; break; case DISC_ADJ_EULER: case DISC_ADJ_NAVIER_STOKES: case DISC_ADJ_RANS: @@ -11373,7 +11373,7 @@ void COutput::SpecialOutput_FSI(ofstream *FSIHist_file, CGeometry ****geometry, case EULER : case NAVIER_STOKES: case RANS : FSIHist_file[0] << flow_coeff; - if (turbulent) FSIHist_file[0] << turb_resid; + //if (turbulent) FSIHist_file[0] << turb_resid; if (direct_diff != NO_DERIVATIVE) { FSIHist_file[0] << d_flow_coeff; } @@ -11617,7 +11617,9 @@ void COutput::SetSensitivity_Files(CGeometry ***geometry, CConfig **config, unsi if((config[iZone]->GetMarker_All_KindBC(iMarker) == HEAT_FLUX ) || (config[iZone]->GetMarker_All_KindBC(iMarker) == EULER_WALL ) || (config[iZone]->GetMarker_All_KindBC(iMarker) == ISOTHERMAL ) || - (config[iZone]->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE )) { + (config[iZone]->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE ) || + (config[iZone]->GetMarker_All_KindBC(iMarker) == CLAMPED_BOUNDARY ) || + (config[iZone]->GetMarker_All_KindBC(iMarker) == LOAD_BOUNDARY )) { nVertex = geometry[iZone][INST_0]->GetnVertex(iMarker); @@ -14334,6 +14336,16 @@ void COutput::LoadLocalData_Elasticity(CConfig *config, CGeometry *geometry, CSo if (geometry->GetnDim() == 3) Variable_Names.push_back("Displacement_z"); + /*--- For the discrete adjoint, we have the full field of sensitivity + in each coordinate direction. ---*/ + if (config->GetDiscrete_Adjoint()) { + nVar_Par += geometry->GetnDim(); + Variable_Names.push_back("Sensitivity_x"); + Variable_Names.push_back("Sensitivity_y"); + if (geometry->GetnDim() == 3) + Variable_Names.push_back("Sensitivity_z"); + } + /*--- If requested, register the limiter and residuals for all of the equations in the current flow problem. ---*/ @@ -14463,14 +14475,21 @@ void COutput::LoadLocalData_Elasticity(CConfig *config, CGeometry *geometry, CSo iVar++; } - /*--- Load the conservative variable states for the mean flow variables. - If requested, load the limiters and residuals as well. ---*/ + /*--- Load the displacements / adjoint displacements. ---*/ for (jVar = 0; jVar < nVar_First; jVar++) { Local_Data[jPoint][iVar] = solver[FirstIndex]->node[iPoint]->GetSolution(jVar); iVar++; } + /*--- Load data for the discrete sensitivities. ---*/ + + if (config->GetDiscrete_Adjoint()) + for (iDim = 0; iDim < geometry->GetnDim(); iDim++) + Local_Data[jPoint][iVar++] = solver[FirstIndex]->node[iPoint]->GetSensitivity(iDim); + + /*--- Residuals. ---*/ + if (!config->GetLow_MemoryOutput()) { if (config->GetWrt_Residuals()) { for (jVar = 0; jVar < nVar_First; jVar++) { @@ -17964,6 +17983,8 @@ void COutput::WriteRestart_Parallel_Binary(CConfig *config, CGeometry *geometry, filename = config->GetUnsteady_FileName(filename, SU2_TYPE::Int(iExtIter)); } else if ((fem) && (config->GetWrt_Dynamic())) { filename = config->GetUnsteady_FileName(filename, SU2_TYPE::Int(iExtIter)); + } else if (config->GetDynamic_Analysis() == DYNAMIC) { + filename = config->GetUnsteady_FileName(filename, SU2_TYPE::Int(iExtIter)); } strcpy(fname, filename.c_str()); diff --git a/SU2_CFD/src/solver_adjoint_elasticity.cpp b/SU2_CFD/src/solver_adjoint_elasticity.cpp index 87641562a43f..f39a8c96bd31 100644 --- a/SU2_CFD/src/solver_adjoint_elasticity.cpp +++ b/SU2_CFD/src/solver_adjoint_elasticity.cpp @@ -54,6 +54,7 @@ CDiscAdjFEASolver::CDiscAdjFEASolver(void) : CSolver (){ Solution_Vel = NULL; Solution_Accel= NULL; +// element_container = NULL; } CDiscAdjFEASolver::CDiscAdjFEASolver(CGeometry *geometry, CConfig *config) : CSolver(){ @@ -74,6 +75,7 @@ CDiscAdjFEASolver::CDiscAdjFEASolver(CGeometry *geometry, CConfig *config) : CS SolRest = NULL; +// element_container = NULL; } CDiscAdjFEASolver::CDiscAdjFEASolver(CGeometry *geometry, CConfig *config, CSolver *direct_solver, unsigned short Kind_Solver, unsigned short iMesh) : CSolver(){ @@ -131,6 +133,29 @@ CDiscAdjFEASolver::CDiscAdjFEASolver(CGeometry *geometry, CConfig *config, CSolv // } // } + // // CVC: Debug + // unsigned short iTerm, iKind; + // int EL_KIND = 0, FEA_TERM = 0; + // /*--- Here is where we assign the kind of each element ---*/ + + // /*--- First level: different possible terms of the equations ---*/ + // element_container = new CElement** [MAX_TERMS]; + // for (iTerm = 0; iTerm < MAX_TERMS; iTerm++) + // element_container[iTerm] = new CElement* [MAX_FE_KINDS]; + + // for (iTerm = 0; iTerm < MAX_TERMS; iTerm++) { + // for (iKind = 0; iKind < MAX_FE_KINDS; iKind++) { + // element_container[iTerm][iKind] = NULL; + // } + // } + + // if (nDim == 2) { + + // /*--- Basic terms ---*/ + // element_container[FEA_TERM][EL_TRIA] = new CTRIA1(nDim, config); + // element_container[FEA_TERM][EL_QUAD] = new CQUAD4(nDim, config); + // } + /*--- Allocate the node variables ---*/ node = new CVariable*[nPoint]; @@ -443,6 +468,18 @@ CDiscAdjFEASolver::CDiscAdjFEASolver(CGeometry *geometry, CConfig *config, CSolv CDiscAdjFEASolver::~CDiscAdjFEASolver(void){ + // // CVC: Debug + // unsigned short iVar, jVar; + // if (element_container != NULL) { + // for (iVar = 0; iVar < MAX_TERMS; iVar++) { + // for (jVar = 0; jVar < MAX_FE_KINDS; jVar++) { + // if (element_container[iVar][jVar] != NULL) delete element_container[iVar][jVar]; + // } + // delete [] element_container[iVar]; + // } + // delete [] element_container; + // } + unsigned short iMarker; if (CSensitivity != NULL) { @@ -623,6 +660,71 @@ void CDiscAdjFEASolver::RegisterVariables(CGeometry *geometry, CConfig *config, if(fea_dv){ for (iVar = 0; iVar < nDV; iVar++) AD::RegisterInput(DV_Val[iVar]); } + bool dynamic_analysis = (config->GetDynamic_Analysis() == DYNAMIC); + + if (!dynamic_analysis) { + cout << "CVC: Debug: Static analysis: RegisterCoordinates" << endl; + geometry->RegisterCoordinates(config); + } + else { + cout << "CVC: Debug: Dynamic analysis: RegisterCoordinates" << endl; + geometry->RegisterCoordinates(config); + + // // Coords + Disp + // unsigned short iDim; + // unsigned long iPoint, nPoint = geometry->GetnPoint(); + // cout << "CVC: Debug: nPoint = " << nPoint << endl; + // cout << "CVC: Debug: nDim = " << nDim << endl; + // su2double DispCoord; + // for (iPoint = 0; iPoint < nPoint; iPoint++) { + // for (iDim = 0; iDim < nDim; iDim++) { + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug Coord[" << iDim << "] = " << geometry->node[iPoint]->GetCoord()[iDim] << endl; + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug Disp[" << iDim << "] = " << direct_solver->node[iPoint]->GetSolution(iDim) << endl; + // DispCoord = geometry->node[iPoint]->GetCoord()[iDim] + direct_solver->node[iPoint]->GetSolution(iDim); + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug DispCoord = " << DispCoord << endl; + // AD::RegisterInput(DispCoord); + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug: node[" << iPoint << "] Input Registered" << endl; + // } + // } + + // // Register displacements + // unsigned short iDim; + // unsigned long iPoint, nPoint = geometry->GetnPoint(); + // cout << "CVC: Debug: nPoint = " << nPoint << endl; + // cout << "CVC: Debug: nDim = " << nDim << endl; + // //su2double *solDisp; + // for (iPoint = 0; iPoint < nPoint; iPoint++) { + // //solDisp = direct_solver->node[iPoint]->GetSolution(); + // for (iDim = 0; iDim < nDim; iDim++) { + // if (iPoint == 0 && iDim == 0) cout << "CVC: disp[" << iPoint << "] coord[" << iDim << "] = " << direct_solver->node[iPoint]->GetSolution()[iDim] << endl; + // AD::RegisterInput(direct_solver->node[iPoint]->GetSolution()[iDim]); + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug: node[" << iPoint << "] Input Registered" << endl; + // } + // } + + + // // Register current coordinates + // unsigned long iElem; + // unsigned short iNode, iDim, nNodes = 0; + // int EL_KIND = 0, FEA_TERM = 0; + + // for (iElem = 0; iElem < geometry->GetnElem(); iElem++) { + + // if (geometry->elem[iElem]->GetVTK_Type() == TRIANGLE) {nNodes = 3; EL_KIND = EL_TRIA;} + // if (geometry->elem[iElem]->GetVTK_Type() == QUADRILATERAL) {nNodes = 4; EL_KIND = EL_QUAD;} + + // /*--- For the number of nodes, we get the coordinates from the connectivity matrix ---*/ + + // for (iNode = 0; iNode < nNodes; iNode++) { + // for (iDim = 0; iDim < nDim; iDim++) { + // AD::RegisterInput(element_container[FEA_TERM][EL_KIND]->GetCurr_Coord(iNode, iDim)); + // } + // } + // } + + cout << "CVC: Debug: Dynamic analysis: RegisterCoordinates Completed" << endl; + + } if (config->GetTopology_Optimization()) direct_solver->RegisterVariables(geometry,config); @@ -863,9 +965,10 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co void CDiscAdjFEASolver::ExtractAdjoint_Variables(CGeometry *geometry, CConfig *config){ - unsigned short iVar; + unsigned short iVar, iDim; + unsigned long iPoint; - /*--- Extract the adjoint values of the farfield values ---*/ + /*--- Extract the adjoint values of the material properties ---*/ if (KindDirect_Solver == RUNTIME_FEA_SYS){ @@ -911,6 +1014,91 @@ void CDiscAdjFEASolver::ExtractAdjoint_Variables(CGeometry *geometry, CConfig *c #endif } + + /*--- Extract the adjoint values of the grid coordinates ---*/ + bool dynamic = (config->GetDynamic_Analysis() == DYNAMIC); + su2double *adj_coord = new su2double[nDim]; + + if (!dynamic) { + for (iPoint = 0; iPoint < nPoint; ++iPoint) { + for (iDim = 0; iDim < nDim; iDim++){ + adj_coord[iDim] = SU2_TYPE::GetDerivative(geometry->node[iPoint]->GetCoord()[iDim]); + node[iPoint]->SetSensitivity(iDim, adj_coord[iDim]); + } + } + delete [] adj_coord; + } + else { + cout << "CVC: Debug: Dynamic extract adjoint variables" << endl; + // Coords + unsigned long iPoint, nPoint = geometry->GetnPoint(); + unsigned short iDim; + su2double *adj_coord = new su2double[nDim]; + for (iPoint = 0; iPoint < nPoint; ++iPoint) { + for (iDim = 0; iDim < nDim; iDim++){ + if (iPoint == 0 && iDim == 0) cout << "CVC: Debug Coord[" << iDim << "] = " << geometry->node[iPoint]->GetCoord()[iDim] << endl; + adj_coord[iDim] = SU2_TYPE::GetDerivative(geometry->node[iPoint]->GetCoord()[iDim]); + //cout << "CVC: Debug Disp[" << iPoint << "][" << iDim << "] = " << direct_solver->node[iPoint]->GetSolution(iDim) << endl; + if (iPoint == 0 && iDim == 0) cout << "CVC: Debug adj_coord[" << iDim << "] = " << adj_coord[iDim] << endl; + node[iPoint]->SetSensitivity(iDim, adj_coord[iDim]); + if (iPoint == 0 && iDim == 0) cout << "CVC: Debug: node[" << iPoint << "] Sensitivity set" << endl; + } + } + delete [] adj_coord; + + // // Coords + Disp + // unsigned long iPoint, nPoint = geometry->GetnPoint(); + // unsigned short iDim; + // su2double *adj_coord = new su2double[nDim]; + // su2double DispCoord; + // for (iPoint = 0; iPoint < nPoint; ++iPoint) { + // for (iDim = 0; iDim < nDim; iDim++){ + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug Coord[" << iDim << "] = " << geometry->node[iPoint]->GetCoord()[iDim] << endl; + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug Disp[" << iDim << "] = " << direct_solver->node[iPoint]->GetSolution(iDim) << endl; + // DispCoord = geometry->node[iPoint]->GetCoord()[iDim] + direct_solver->node[iPoint]->GetSolution(iDim); + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug DispCoord = " << DispCoord << endl; + // adj_coord[iDim] = SU2_TYPE::GetDerivative(DispCoord); + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug adj_coord[" << iDim << "] = " << adj_coord[iDim] << endl; + // node[iPoint]->SetSensitivity(iDim, adj_coord[iDim]); + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug: node[" << iPoint << "] Sensitivity set" << endl; + // } + // } + // delete [] adj_coord; + + // // Disp + // unsigned long iPoint, nPoint = geometry->GetnPoint(); + // unsigned short iDim; + // su2double *adj_coord = new su2double[nDim]; + // for (iPoint = 0; iPoint < nPoint; ++iPoint) { + // for (iDim = 0; iDim < nDim; iDim++){ + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug Disp[" << iDim << "] = " << direct_solver->node[iPoint]->GetSolution(iDim) << endl;; + // adj_coord[iDim] = SU2_TYPE::GetDerivative(direct_solver->node[iPoint]->GetSolution(iDim)); + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug adj_coord[" << iDim << "] = " << adj_coord[iDim] << endl; + // node[iPoint]->SetSensitivity(iDim, adj_coord[iDim]); + // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug: node[" << iPoint << "] Sensitivity set" << endl; + // } + // } + // delete [] adj_coord; + + // //su2double DispCoord; + // for (iPoint = 0; iPoint < nPoint; ++iPoint) { + // for (iDim = 0; iDim < nDim; iDim++){ + // // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug: ExtractAdjoint_Variables Nodes" << endl; + // // adj_coord[iDim] = SU2_TYPE::GetDerivative(geometry->node[iPoint]->GetCoord()[iDim]); + + // // Displaced nodes + // //DispCoord = geometry->node[iPoint]->GetCoord()[iDim]+direct_solver->node[iPoint]->GetSolution()[iDim]; + // adj_coord[iDim] = SU2_TYPE::GetDerivative(direct_solver->node[iPoint]->GetDispCoord()[iDim]); + // AD::ResetInput(direct_solver->node[iPoint]->GetDispCoord()[iDim]); + + // // if (iPoint == 0 && iDim == 0) cout << "CVC: Debug: adj_coord[" << iDim << "] = " << adj_coord[iDim] << endl; + // cout << "CVC: Debug: iPoint = " << iPoint << ", adj_coord[" << iDim << "] = " << adj_coord[iDim] << endl; + // node[iPoint]->SetSensitivity(iDim, adj_coord[iDim]); + // } + //} + // delete [] adj_coord; + } + cout << "CVC: Debug: Completed ExtractAdjoint_Variables" << endl; if (config->GetTopology_Optimization()) direct_solver->ExtractAdjoint_Variables(geometry,config); diff --git a/SU2_CFD/src/solver_direct_elasticity.cpp b/SU2_CFD/src/solver_direct_elasticity.cpp index 2f2b033f8f58..0bd76b4b48a7 100644 --- a/SU2_CFD/src/solver_direct_elasticity.cpp +++ b/SU2_CFD/src/solver_direct_elasticity.cpp @@ -1150,10 +1150,11 @@ void CFEASolver::Compute_StiffMatrix(CGeometry *geometry, CSolver **solver_conta for (iNode = 0; iNode < nNodes; iNode++) { indexNode[iNode] = geometry->elem[iElem]->GetNode(iNode); - + // CVC: Debug: reference nodes and displaced nodes for (iDim = 0; iDim < nDim; iDim++) { val_Coord = geometry->node[indexNode[iNode]]->GetCoord(iDim); val_Sol = node[indexNode[iNode]]->GetSolution(iDim) + val_Coord; + //cout << "CVC: Debug: iNode = " << iNode << ", iDim = " << iDim << ", val_Sol = " << val_Sol << endl; element_container[FEA_TERM][EL_KIND]->SetRef_Coord(val_Coord, iNode, iDim); element_container[FEA_TERM][EL_KIND]->SetCurr_Coord(val_Sol, iNode, iDim); } @@ -1248,8 +1249,9 @@ void CFEASolver::Compute_StiffMatrix_NodalStressRes(CGeometry *geometry, CSolver for (iDim = 0; iDim < nDim; iDim++) { val_Coord = geometry->node[indexNode[iNode]]->GetCoord(iDim); val_Sol = node[indexNode[iNode]]->GetSolution(iDim) + val_Coord; - + //if (iDim == 0) cout << "CVC: Debug: coord = " << val_Coord << ", disp = " << node[indexNode[iNode]]->GetSolution(iDim) << endl; /*--- Set current coordinate ---*/ + //if (iDim == 0) cout << "CVC: Debug: iNode = " << iNode << ", iDim = " << iDim << ", val_Sol Curr_Coord = " << val_Sol << endl; element_container[FEA_TERM][EL_KIND]->SetCurr_Coord(val_Sol, iNode, iDim); if (de_effects) element_container[DE_TERM][EL_KIND]->SetCurr_Coord(val_Sol, iNode, iDim); @@ -3042,14 +3044,14 @@ su2double CFEASolver::Compute_LoadCoefficient(su2double CurrentTime, su2double R LoadCoeff = min(LoadCoeff,1.0); } - else if (Sine_Load){ + else if (Sine_Load){ //Allow sine load with initial ramp loading as well /*--- Retrieve amplitude, frequency (Hz) and phase (rad) ---*/ SineAmp = config->GetLoad_Sine()[0]; SineFreq = config->GetLoad_Sine()[1]; SinePhase = config->GetLoad_Sine()[2]; - LoadCoeff = SineAmp * sin(2*PI_NUMBER*SineFreq*CurrentTime + SinePhase); + LoadCoeff = LoadCoeff * SineAmp * sin(2*PI_NUMBER*SineFreq*CurrentTime + SinePhase); } /*--- Add possibility to release the load after the ramp---*/ diff --git a/SU2_CFD/src/solver_direct_mean.cpp b/SU2_CFD/src/solver_direct_mean.cpp index 0bf1abc05f1b..7deb754347e3 100644 --- a/SU2_CFD/src/solver_direct_mean.cpp +++ b/SU2_CFD/src/solver_direct_mean.cpp @@ -13031,7 +13031,7 @@ void CEulerSolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig /*--- Update the old geometry (coordinates n and n-1) in dual time-stepping strategy ---*/ - if (dual_time && grid_movement) + if (dual_time && grid_movement && (config->GetKind_GridMovement() != RIGID_MOTION)) Restart_OldGeometry(geometry[MESH_0], config); delete [] Coord; diff --git a/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp b/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp index c21c7f382c85..a610883efc4b 100644 --- a/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp +++ b/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp @@ -201,6 +201,7 @@ CDiscAdjFEAVariable::CDiscAdjFEAVariable(su2double* val_solution, su2double* val if (fsi){ Cross_Term_Derivative = new su2double[nDim]; Geometry_CrossTerm_Derivative = new su2double[nDim]; + Solution_BGS = new su2double[nDim]; Solution_BGS_k = new su2double[nDim]; for (iDim = 0; iDim < nDim; iDim++) { Geometry_CrossTerm_Derivative [iDim] = 0.0; diff --git a/SU2_DOT/src/SU2_DOT.cpp b/SU2_DOT/src/SU2_DOT.cpp index 3f5e17b2abc6..3ef6f3893d48 100644 --- a/SU2_DOT/src/SU2_DOT.cpp +++ b/SU2_DOT/src/SU2_DOT.cpp @@ -847,6 +847,7 @@ void SetProjection_AD(CGeometry *geometry, CConfig *config, CSurfaceMovement *su } Gradient[iDV][iDV_Value] += localGradient; + if (rank == MASTER_NODE) cout << "CVC: Debug: SU2_DOT.cpp: SetProjection_AD localGradient["<< iDV << "][" << iDV_Value << "] = " << localGradient << endl; } } diff --git a/SU2_PY/SU2/eval/functions.py b/SU2_PY/SU2/eval/functions.py index 08051f738366..209958a7f702 100644 --- a/SU2_PY/SU2/eval/functions.py +++ b/SU2_PY/SU2/eval/functions.py @@ -44,6 +44,7 @@ from .. import io as su2io from .. import util as su2util from ..io import redirect_folder, redirect_output +from numpy import * # ---------------------------------------------------------------------- @@ -121,7 +122,11 @@ def function( func_name, config, state=None ): # If combine_objective is true, use the 'combo' output. func_out = state['FUNCTIONS']['COMBO'] else: - func_out = state['FUNCTIONS'][func_name] + if config['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': + filename = os.getcwd() + '/DIRECT/of_refnode.dat' + func_out = loadtxt(filename) + else: + func_out = state['FUNCTIONS'][func_name] if func_name_string in config['OPT_OBJECTIVE']: marker = config['OPT_OBJECTIVE'][func_name_string]['MARKER'] @@ -131,7 +136,10 @@ def function( func_name, config, state=None ): func_out = state['FUNCTIONS'][name] - return copy.deepcopy(func_out) + #if config['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': + return func_out + #else: + # return copy.deepcopy(func_out) #: def function() diff --git a/SU2_PY/SU2/eval/gradients.py b/SU2_PY/SU2/eval/gradients.py index 390a3382c67e..7bb191976244 100644 --- a/SU2_PY/SU2/eval/gradients.py +++ b/SU2_PY/SU2/eval/gradients.py @@ -46,7 +46,7 @@ from .functions import function, update_mesh from ..io import redirect_folder, redirect_output from SU2.eval import functions - +import numpy as np # ---------------------------------------------------------------------- # Main Gradient Interface # ---------------------------------------------------------------------- @@ -139,6 +139,11 @@ def gradient( func_name, method, config, state=None ): # prepare output grads_out = state['GRADIENTS'][func_output] + if konfig['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': + filename = os.getcwd() + '/DIRECT/of_refnode.dat' + func_out = np.loadtxt(filename) + else: + func_out = state['FUNCTIONS'][func_name] return copy.deepcopy(grads_out) @@ -668,6 +673,8 @@ def findiff( config, state=None ): # initialize gradients func_keys = list(func_base.keys()) + if config['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE':#CVC: Debug: REFNODE + func_keys = ['REFNODE'] func_keys = ['VARIABLE'] + func_keys + ['FINDIFF_STEP'] grads = su2util.ordered_bunch.fromkeys(func_keys) for key in grads.keys(): grads[key] = [] @@ -688,6 +695,7 @@ def findiff( config, state=None ): # files: direct solution if 'DIRECT' in files: name = files['DIRECT'] + name = su2io.expand_zones(name, config) name = su2io.expand_time(name,config) link.extend(name) @@ -739,7 +747,14 @@ def findiff( config, state=None ): elif key == 'FINDIFF_STEP': grads[key].append(this_step) else: - this_grad = ( func_step[key] - func_base[key] ) / this_step + if config['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE':#CVC: Debug: REFNODE + filename = os.path.dirname(os.getcwd()) + '/DIRECT/of_refnode.dat' + of_direct = np.loadtxt(filename) + filename = os.getcwd() + '/DIRECT/of_refnode.dat' + of_findiff = np.loadtxt(filename) + this_grad = ( of_findiff - of_direct ) / this_step + else: + this_grad = ( func_step[key] - func_base[key] ) / this_step grads[key].append(this_grad) @@ -962,6 +977,7 @@ def directdiff( config, state=None ): # files: direct solution if 'DIRECT' in files: name = files['DIRECT'] + name = su2io.expand_zones(name, config) name = su2io.expand_time(name,config) link.extend(name) diff --git a/SU2_PY/SU2/io/tools.py b/SU2_PY/SU2/io/tools.py index ab2991cb489d..33069b8e6793 100755 --- a/SU2_PY/SU2/io/tools.py +++ b/SU2_PY/SU2/io/tools.py @@ -126,7 +126,12 @@ def read_plot( filename ): # store to dictionary for i_Var in range(n_Vars): this_variable = Variables[i_Var] - plot_data[this_variable] = plot_data[this_variable] + [ line_data[i_Var] ] + # CVC: Temporary fix till full dataset is populated for FSI + # CVC: VM Stress and Time have header but no data in history file for FSI + try: + plot_data[this_variable] = plot_data[this_variable] + [ line_data[i_Var] ] + except (IndexError): + plot_data[this_variable] = '0.0' #: for each line @@ -187,6 +192,7 @@ def get_headerMap(nZones = 1): """ # header name to config file name map history_header_map = { "Iteration" : "ITERATION" , + "REFNODE" : "REFERENCE_NODE" , "CL" : "LIFT" , "CD" : "DRAG" , "CSF" : "SIDEFORCE" , @@ -313,6 +319,7 @@ def getTurboPerfIndex(nZones = 1): "TOTAL_HEATFLUX" , "MAXIMUM_HEATFLUX" , "CUSTOM_OBJFUNC" , + "REFERENCE_NODE" , "COMBO"] # Turbo performance optimizer Function Names @@ -652,6 +659,7 @@ def get_adjointSuffix(objective_function=None): "MASS_FLOW_IN" : "mfi" , "TOTAL_EFFICIENCY" : "teff" , "TOTAL_STATIC_EFFICIENCY" : "tseff" , + "REFERENCE_NODE" : "refnode" , "COMBO" : "combo"} # if none or false, return map @@ -803,6 +811,9 @@ def get_gradFileFormat(grad_type,plot_format,kindID,special_cases=[]): if key == "INV_DESIGN_HEATFLUX" : header.append(r',"Grad_HeatFlux_Diff"') write_format.append(", %.10f") + if key == "REF_NODE" : + header.append(r',"Grad_RefNode"') + write_format.append(", %.10f") # otherwise... else: raise Exception('Unrecognized Gradient Type') @@ -924,6 +935,9 @@ def get_optFileFormat(plot_format,special_cases=None, nZones = 1): if key == "INV_DESIGN_HEATFLUX" : header_list.extend(["HeatFlux_Diff"]) write_format.append(r', %.10f') + if key == "REF_NODE" : + header_list.extend(["REF_NODE"]) + write_format.append(r', %.10f') # finish formats header_format = (header_format) + ('"') + ('","').join(header_list) + ('"') + (' \n') @@ -976,7 +990,8 @@ def get_specialCases(config): 'EQUIV_AREA' , '1D_OUTPUT' , 'INV_DESIGN_CP' , - 'INV_DESIGN_HEATFLUX' ] + 'INV_DESIGN_HEATFLUX' , + 'REF_NODE']#CVC: Debug: special_cases = [] for key in all_special_cases: @@ -1003,6 +1018,10 @@ def get_specialCases(config): # Special case for rotating frame if 'GRID_MOVEMENT_KIND' in config and config['GRID_MOVEMENT_KIND'] == 'ROTATING_FRAME': special_cases.append('ROTATING_FRAME') + + #CVC: Debug: + if config['OBJECTIVE_FUNCTION'] == 'RERFERENCE_NODE': + special_cases.append('REF_NODE') return special_cases @@ -1174,7 +1193,10 @@ def restart2solution(config,state={}): solution = config.SOLUTION_ADJ_FILENAME # add suffix func_name = config.OBJECTIVE_FUNCTION - suffix = get_adjointSuffix(func_name) + if config['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': + suffix = "refnode" + else: + suffix = get_adjointSuffix(func_name) restart = add_suffix(restart,suffix) solution = add_suffix(solution,suffix) # expand zones diff --git a/SU2_PY/SU2/opt/project.py b/SU2_PY/SU2/opt/project.py index c59a87707b7f..91b5e131469a 100644 --- a/SU2_PY/SU2/opt/project.py +++ b/SU2_PY/SU2/opt/project.py @@ -441,13 +441,14 @@ def compile_results(self,default=np.nan): results.GRADIENTS[key].append(new_grad) for TYPE in results.HISTORY.keys(): for key in results.HISTORY[TYPE].keys(): - if key in results.FUNCTIONS.keys(): - new_func = results.FUNCTIONS[key][-1] - elif ( TYPE in design.state.HISTORY.keys() and - key in design.state.HISTORY[TYPE].keys() ): - new_func = design.state.HISTORY[TYPE][key][-1] - else: - new_func = default + # if key in results.FUNCTIONS.keys(): + # new_func = results.FUNCTIONS[key][-1] + # elif ( TYPE in design.state.HISTORY.keys() and + # key in design.state.HISTORY[TYPE].keys() ): + # new_func = design.state.HISTORY[TYPE][key][-1] + # else: + # new_func = default + new_func = default results.HISTORY[TYPE][key].append(new_func) #: for each design diff --git a/SU2_PY/SU2/run/adjoint.py b/SU2_PY/SU2/run/adjoint.py index 0a1631284100..e71a06eee473 100644 --- a/SU2_PY/SU2/run/adjoint.py +++ b/SU2_PY/SU2/run/adjoint.py @@ -39,7 +39,7 @@ # Imports # ---------------------------------------------------------------------- -import copy +import os, copy from .. import io as su2io from .merge import merge as su2merge @@ -84,7 +84,7 @@ def adjoint( config ): konfig['MATH_PROBLEM'] = 'CONTINUOUS_ADJOINT' konfig['CONV_FILENAME'] = konfig['CONV_FILENAME'] + '_adjoint' - + konfig['RAMP_LOADING'] = 'NO' #CVC: Temp to allow ramp only in direct sim from single config python scripts # Run Solution SU2_CFD(konfig) @@ -95,7 +95,11 @@ def adjoint( config ): # filenames plot_format = konfig['OUTPUT_FORMAT'] plot_extension = su2io.get_extension(plot_format) - history_filename = konfig['CONV_FILENAME'] + plot_extension + # CVC: Adjustment needed as FSI history filenames are different + if konfig['PHYSICAL_PROBLEM'] == 'FLUID_STRUCTURE_INTERACTION': + history_filename = 'history_adjoint_FSI' + plot_extension + else: + history_filename = konfig['CONV_FILENAME'] + plot_extension special_cases = su2io.get_specialCases(konfig) # get history @@ -110,7 +114,10 @@ def adjoint( config ): if "," in objective: objective="COMBO" adj_title = 'ADJOINT_' + objective - suffix = su2io.get_adjointSuffix(objective) + if konfig['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': + suffix = "refnode" + else: + suffix = su2io.get_adjointSuffix(objective) restart_name = konfig['RESTART_FLOW_FILENAME'] restart_name = su2io.add_suffix(restart_name,suffix) diff --git a/SU2_PY/SU2/run/direct.py b/SU2_PY/SU2/run/direct.py index ea89ee04f7ab..1885cb142012 100644 --- a/SU2_PY/SU2/run/direct.py +++ b/SU2_PY/SU2/run/direct.py @@ -39,7 +39,7 @@ # Imports # ---------------------------------------------------------------------- -import copy +import shutil, copy from .. import io as su2io from .merge import merge as su2merge @@ -98,7 +98,12 @@ def direct ( config ): # filenames plot_format = konfig['OUTPUT_FORMAT'] plot_extension = su2io.get_extension(plot_format) - history_filename = konfig['CONV_FILENAME'] + plot_extension + # CVC: Adjustment needed as FSI history filenames are different + if konfig['PHYSICAL_PROBLEM'] == 'FLUID_STRUCTURE_INTERACTION': + shutil.copy(konfig['CONV_FILENAME_FSI'] + '.vtk',konfig['CONV_FILENAME_FSI'] + '.csv') + history_filename = konfig['CONV_FILENAME_FSI'] + '.csv' + else: + history_filename = konfig['CONV_FILENAME'] + plot_extension special_cases = su2io.get_specialCases(konfig) # averaging final iterations diff --git a/SU2_PY/SU2/run/projection.py b/SU2_PY/SU2/run/projection.py index 54b027ffaefc..ebf38b6c4fea 100644 --- a/SU2_PY/SU2/run/projection.py +++ b/SU2_PY/SU2/run/projection.py @@ -96,7 +96,10 @@ def projection( config, state={}, step = 1e-3 ): grad_filename = konfig['GRAD_OBJFUNC_FILENAME'] output_format = konfig['OUTPUT_FORMAT'] plot_extension = su2io.get_extension(output_format) - adj_suffix = su2io.get_adjointSuffix(objective) + if konfig['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': + adj_suffix = "refnode" + else: + adj_suffix = su2io.get_adjointSuffix(objective) grad_plotname = os.path.splitext(grad_filename)[0] + '_' + adj_suffix + plot_extension # Run Projection diff --git a/SU2_PY/shape_optimization.py b/SU2_PY/shape_optimization.py index 6d89d1ad223c..cfb9054a23c9 100755 --- a/SU2_PY/shape_optimization.py +++ b/SU2_PY/shape_optimization.py @@ -135,16 +135,26 @@ def shape_optimization( filename , config.GRADIENT_METHOD = gradient its = int ( config.OPT_ITERATIONS ) # number of opt iterations - bound_upper = float ( config.OPT_BOUND_UPPER ) # variable bound to be scaled by the line search - bound_lower = float ( config.OPT_BOUND_LOWER ) # variable bound to be scaled by the line search + bound_upper = map(float, config.OPT_BOUND_UPPER.split(',')) # variable bound to be scaled by the line search + bound_lower = map(float, config.OPT_BOUND_LOWER.split(',')) # variable bound to be scaled by the line search relax_factor = float ( config.OPT_RELAX_FACTOR ) # line search scale gradient_factor = float ( config.OPT_GRADIENT_FACTOR ) # objective function and gradient scale def_dv = config.DEFINITION_DV # complete definition of the desing variable n_dv = sum(def_dv['SIZE']) # number of design variables accu = float ( config.OPT_ACCURACY ) * gradient_factor # optimizer accuracy x0 = [0.0]*n_dv # initial design - xb_low = [float(bound_lower)/float(relax_factor)]*n_dv # lower dv bound it includes the line search acceleration factor - xb_up = [float(bound_upper)/float(relax_factor)]*n_dv # upper dv bound it includes the line search acceleration fa + if len(bound_upper) == n_dv: + xb_up = [0] * len(bound_upper) + for i in range(0, len(bound_upper), 1): + xb_up[i] = bound_upper[i]/relax_factor # upper dv bound it includes the line search acceleration factor + else: + xb_up = [bound_upper[0]/relax_factor]*n_dv # upper dv bound it includes the line search acceleration factor + if len(bound_lower) == n_dv: + xb_low = [0] * len(bound_lower) + for i in range(0, len(bound_lower), 1): + xb_low[i] = bound_lower[i]/relax_factor # lower dv bound it includes the line search acceleration factor + else: + xb_low = [bound_lower[0]/relax_factor]*n_dv # lower dv bound it includes the line search acceleration factor xb = list(zip(xb_low, xb_up)) # design bounds # State From 32f4b292fe0a1b437311e96d079dba39e58c08d8 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 11 Aug 2019 11:11:13 +0100 Subject: [PATCH 02/82] fixes for dynamic fluid discrete adjoint --- Common/src/geometry_structure.cpp | 7 +++---- SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Common/src/geometry_structure.cpp b/Common/src/geometry_structure.cpp index 97b4d9972f60..76734c884a34 100755 --- a/Common/src/geometry_structure.cpp +++ b/Common/src/geometry_structure.cpp @@ -16066,6 +16066,9 @@ void CPhysicalGeometry::SetSensitivity(CConfig *config) { else if (Kind_Solver == DISC_ADJ_HEAT) { skipVar += 1; } + else if (Kind_Solver == DISC_ADJ_FEM) { + skipVar = 4; //To do: make generic: //Dyn nFields=10, Sta nFields=6 + } else { cout << "WARNING: Reading in sensitivities not defined for specified solver!" << endl; } @@ -16378,10 +16381,6 @@ void CPhysicalGeometry::SetSensitivity(CConfig *config) { /*--- We need to store this point's data, so jump to the correct offset in the buffer of data from the restart file and load it. ---*/ - //Dyn nFields=10, Sta nFields=6 - if (config->GetDynamic_Analysis() == DYNAMIC) skipVar = 4; - else skipVar = nFields*2/3; - //CVC: Temporary correction : New index to get sensitivity from both compressible flow and structural adjoint solution files index = counter*nFields + skipVar; for (iDim = 0; iDim < nDim; iDim++) Sensitivity[iPoint_Local*nDim+iDim] = Restart_Data[index+iDim]; diff --git a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp index 246344b697bc..86bf2ac1d6a7 100644 --- a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp @@ -148,15 +148,15 @@ void CDiscAdjSinglezoneDriver::Run() { /*--- Secondary sensitivities must be computed with a certain frequency. ---*/ /*--- It is also done at the beginning so all memory gets allocated. ---*/ - if ((Adjoint_Iter % config->GetWrt_Sol_Freq() == 0) && (SecondaryVariables != NONE)){ +// if ((Adjoint_Iter % config->GetWrt_Sol_Freq() == 0) && (SecondaryVariables != NONE)){ /*--- Computes secondary sensitivities ---*/ - SecondaryRecording(); +// SecondaryRecording(); /*--- Recompute main sensitivities ---*/ - MainRecording(); +// MainRecording(); - } +// } iteration->InitializeAdjoint(solver_container, geometry_container, config_container, ZONE_0, INST_0); From 45ba51a6aa7cbb167491ba4dea0f13fd3a2a3b00 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 11 Aug 2019 22:36:22 +0100 Subject: [PATCH 03/82] update communication of coordinates and solution --- SU2_CFD/src/iteration_structure.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 9a0ce2e5bbef..276dd0b50a6b 100755 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -3141,9 +3141,15 @@ void CDiscAdjFEAIteration::SetDependencies(CSolver *****solver, CGeometry ****ge } - // CVC: Debug: /*--- Add dependencies for grid coordinate derivatives, no need for full update as the structural solver only uses the node coordinates. ---*/ + /*--- Add dependencies for grid coordinate derivatives, no need for full update as the structural solver only uses the node coordinates. ---*/ + + geometry[iZone][iInst][MESH_0]->InitiateComms(geometry[iZone][iInst][MESH_0], config[iZone], COORDINATES); + geometry[iZone][iInst][MESH_0]->CompleteComms(geometry[iZone][iInst][MESH_0], config[iZone], COORDINATES); + + solver[iZone][iInst][MESH_0][FEA_SOL]->InitiateComms(geometry[iZone][iInst][MESH_0], config[iZone], SOLUTION); + solver[iZone][iInst][MESH_0][FEA_SOL]->CompleteComms(geometry[iZone][iInst][MESH_0], config[iZone], SOLUTION); + - // geometry[iZone][iInst][MESH_0]->Set_MPI_Coord(config[iZone]); } From e37b45613b6a80707abd813e914d367581c32321 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 18 Aug 2019 15:50:28 +0100 Subject: [PATCH 04/82] check for non-zero number of elements before deallocating --- SU2_CFD/src/output_structure.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/SU2_CFD/src/output_structure.cpp b/SU2_CFD/src/output_structure.cpp index 1e09ecf45096..9262c5d01d62 100644 --- a/SU2_CFD/src/output_structure.cpp +++ b/SU2_CFD/src/output_structure.cpp @@ -18490,17 +18490,17 @@ void COutput::DeallocateConnectivity_Parallel(CConfig *config, CGeometry *geomet /*--- Deallocate memory for connectivity data on each processor. ---*/ if (surf_sol) { - if (Conn_BoundLine_Par != NULL) delete [] Conn_BoundLine_Par; - if (Conn_BoundTria_Par != NULL) delete [] Conn_BoundTria_Par; - if (Conn_BoundQuad_Par != NULL) delete [] Conn_BoundQuad_Par; + if (nParallel_Line > 0 && Conn_BoundLine_Par != NULL) delete [] Conn_BoundLine_Par; + if (nParallel_BoundTria > 0 && Conn_BoundTria_Par != NULL) delete [] Conn_BoundTria_Par; + if (nParallel_BoundQuad > 0 && Conn_BoundQuad_Par != NULL) delete [] Conn_BoundQuad_Par; } else { - if (Conn_Tria_Par != NULL) delete [] Conn_Tria_Par; - if (Conn_Quad_Par != NULL) delete [] Conn_Quad_Par; - if (Conn_Tetr_Par != NULL) delete [] Conn_Tetr_Par; - if (Conn_Hexa_Par != NULL) delete [] Conn_Hexa_Par; - if (Conn_Pris_Par != NULL) delete [] Conn_Pris_Par; - if (Conn_Pyra_Par != NULL) delete [] Conn_Pyra_Par; + if (nParallel_Tria > 0 && Conn_Tria_Par != NULL) delete [] Conn_Tria_Par; + if (nParallel_Quad > 0 && Conn_Quad_Par != NULL) delete [] Conn_Quad_Par; + if (nParallel_Tetr > 0 && Conn_Tetr_Par != NULL) delete [] Conn_Tetr_Par; + if (nParallel_Hexa > 0 && Conn_Hexa_Par != NULL) delete [] Conn_Hexa_Par; + if (nParallel_Pris > 0 && Conn_Pris_Par != NULL) delete [] Conn_Pris_Par; + if (nParallel_Pyra > 0 && Conn_Pyra_Par != NULL) delete [] Conn_Pyra_Par; } } From d4aa46fea2595ca8cd7fc7a4e9587df260fbc41e Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 16 Sep 2019 16:01:57 +0100 Subject: [PATCH 05/82] fixes for dynamic structural adjoint --- SU2_CFD/include/iteration_structure.hpp | 12 ++++-- .../src/drivers/CDiscAdjSinglezoneDriver.cpp | 37 ++++++++++--------- SU2_CFD/src/iteration_structure.cpp | 15 ++++++-- 3 files changed, 38 insertions(+), 26 deletions(-) diff --git a/SU2_CFD/include/iteration_structure.hpp b/SU2_CFD/include/iteration_structure.hpp index 3809c1b8ecf4..55bd160634c6 100644 --- a/SU2_CFD/include/iteration_structure.hpp +++ b/SU2_CFD/include/iteration_structure.hpp @@ -1572,12 +1572,16 @@ class CDiscAdjFEAIteration : public CIteration { * \param[in] solver - Container vector with all the solutions. * \param[in] geometry - Geometrical definition of the problem. * \param[in] config - Definition of the particular problem. + * \param[in] output - Pointer to the COutput class. * \param[in] iZone - Index of the zone. - * \param[in] iInst - Index of the zone. + * \param[in] iInst - Index of the instance layer. */ - void RegisterOutput(CSolver *****solver, CGeometry ****geometry, CConfig** config, unsigned short iZone, unsigned short iInst); - using CIteration::RegisterOutput; - + void RegisterOutput(CSolver *****solver, + CGeometry ****geometry, + CConfig** config, + COutput* output, + unsigned short iZone, unsigned short iInst); + /*! * \brief Initializes the adjoints of the output variables of the FEM iteration. * \param[in] solver - Container vector with all the solutions. diff --git a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp index 86bf2ac1d6a7..0607e8b7f030 100644 --- a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp @@ -123,8 +123,8 @@ void CDiscAdjSinglezoneDriver::Preprocess(unsigned long TimeIter) { /*--- For the adjoint iteration we need the derivatives of the iteration function with *--- respect to the conservative variables. Since these derivatives do not change in the steady state case *--- we only have to record if the current recording is different from the main variables. ---*/ - - if (RecordingState != MainVariables){ + + if ((RecordingState != MainVariables) || (config->GetTime_Domain())){ MainRecording(); @@ -361,24 +361,25 @@ void CDiscAdjSinglezoneDriver::SetObjFunction(){ break; case DISC_ADJ_FEM: - switch (config->GetKind_ObjFunc()){ - case REFERENCE_GEOMETRY: - ObjFunc = solver[FEA_SOL]->GetTotal_OFRefGeom(); - break; - case REFERENCE_NODE: - ObjFunc = solver[FEA_SOL]->GetTotal_OFRefNode(); - break; - case VOLUME_FRACTION: - ObjFunc = solver[FEA_SOL]->GetTotal_OFVolFrac(); - break; - default: - ObjFunc = 0.0; // If the objective function is computed in a different physical problem - break; - } + solver[ADJFEA_SOL]->RegisterObj_Func(config); + // switch (config->GetKind_ObjFunc()){ + // case REFERENCE_GEOMETRY: + // ObjFunc = solver[FEA_SOL]->GetTotal_OFRefGeom(); + // break; + // case REFERENCE_NODE: + // ObjFunc = solver[FEA_SOL]->GetTotal_OFRefNode(); + // break; + // case VOLUME_FRACTION: + // ObjFunc = solver[FEA_SOL]->GetTotal_OFVolFrac(); + // break; + // default: + // ObjFunc = 0.0; // If the objective function is computed in a different physical problem + // break; + // } break; } - - if (rank == MASTER_NODE){ + + if ((config->GetKind_Solver() != DISC_ADJ_FEM) && (rank == MASTER_NODE)) { AD::RegisterOutput(ObjFunc); } diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 276dd0b50a6b..ce9190c6c1dc 100755 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -2531,7 +2531,7 @@ void CDiscAdjFluidIteration::SetRecording(CSolver *****solver, unsigned short val_iZone, unsigned short val_iInst, unsigned short kind_recording) { - + unsigned short iMesh; /*--- Prepare for recording by resetting the solution to the initial converged solution ---*/ @@ -2593,7 +2593,7 @@ void CDiscAdjFluidIteration::SetDependencies(CSolver *****solver, } void CDiscAdjFluidIteration::RegisterOutput(CSolver *****solver, CGeometry ****geometry, CConfig **config, COutput* output, unsigned short iZone, unsigned short iInst){ - + unsigned short Kind_Solver = config[iZone]->GetKind_Solver(); bool frozen_visc = config[iZone]->GetFrozen_Visc_Disc(); bool heat = config[iZone]->GetWeakly_Coupled_Heat(); @@ -2981,7 +2981,7 @@ void CDiscAdjFEAIteration::SetRecording(COutput *output, /*--- Register structural variables and objective function as output ---*/ - RegisterOutput(solver, geometry, config, val_iZone, val_iInst); + RegisterOutput(solver, geometry, config, output, val_iZone, val_iInst); /*--- Stop the recording ---*/ @@ -3005,6 +3005,13 @@ void CDiscAdjFEAIteration::SetRecording(CSolver *****solver, unsigned short val_iInst, unsigned short kind_recording) { + /*--- Set correct time iteration for recording if dynamic simulation ---*/ + + if (config[val_iZone]->GetDynamic_Analysis() == DYNAMIC) { + unsigned long ExtIter = config[val_iZone]->GetExtIter(); + config[val_iZone]->SetExtIter(ExtIter); + } + /*--- Prepare for recording by resetting the solution to the initial converged solution ---*/ solver[val_iZone][val_iInst][MESH_0][ADJFEA_SOL]->SetRecording(geometry[val_iZone][val_iInst][MESH_0], config[val_iZone]); @@ -3153,7 +3160,7 @@ void CDiscAdjFEAIteration::SetDependencies(CSolver *****solver, CGeometry ****ge } -void CDiscAdjFEAIteration::RegisterOutput(CSolver *****solver, CGeometry ****geometry, CConfig **config, unsigned short iZone, unsigned short iInst){ +void CDiscAdjFEAIteration::RegisterOutput(CSolver *****solver, CGeometry ****geometry, CConfig **config, COutput* output, unsigned short iZone, unsigned short iInst){ /*--- Register conservative variables as output of the iteration ---*/ From 5e7681929ab838e801138f279d0f14f00c913b11 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 16 Sep 2019 16:26:44 +0100 Subject: [PATCH 06/82] Allow sine loading with initial ramp --- SU2_CFD/src/solver_direct_elasticity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SU2_CFD/src/solver_direct_elasticity.cpp b/SU2_CFD/src/solver_direct_elasticity.cpp index 0bd76b4b48a7..08f316b66b11 100644 --- a/SU2_CFD/src/solver_direct_elasticity.cpp +++ b/SU2_CFD/src/solver_direct_elasticity.cpp @@ -3044,7 +3044,7 @@ su2double CFEASolver::Compute_LoadCoefficient(su2double CurrentTime, su2double R LoadCoeff = min(LoadCoeff,1.0); } - else if (Sine_Load){ //Allow sine load with initial ramp loading as well + if (Sine_Load){ //Allow sine load with initial ramp loading as well /*--- Retrieve amplitude, frequency (Hz) and phase (rad) ---*/ SineAmp = config->GetLoad_Sine()[0]; From 64b6aadc2430f40f99e07fd609f8e21b4164af5f Mon Sep 17 00:00:00 2001 From: cvencro Date: Fri, 20 Sep 2019 15:46:14 +0100 Subject: [PATCH 07/82] fix handling of objective function in the adjoint run for dynamic structural problems --- .../src/drivers/CDiscAdjSinglezoneDriver.cpp | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp index 1e949f7591e2..b9da8ae342d6 100644 --- a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp @@ -279,7 +279,7 @@ void CDiscAdjSinglezoneDriver::SetRecording(unsigned short kind_recording){ void CDiscAdjSinglezoneDriver::SetAdj_ObjFunction(){ - bool time_stepping = config->GetUnsteady_Simulation() != STEADY; + bool time_stepping = config->GetTime_Domain(); unsigned long IterAvg_Obj = config->GetIter_Avg_Objective(); unsigned long ExtIter = config->GetExtIter(); su2double seeding = 1.0; @@ -372,25 +372,28 @@ void CDiscAdjSinglezoneDriver::SetObjFunction(){ break; case DISC_ADJ_FEM: - solver[ADJFEA_SOL]->RegisterObj_Func(config); - // switch (config->GetKind_ObjFunc()){ - // case REFERENCE_GEOMETRY: - // ObjFunc = solver[FEA_SOL]->GetTotal_OFRefGeom(); - // break; - // case REFERENCE_NODE: - // ObjFunc = solver[FEA_SOL]->GetTotal_OFRefNode(); - // break; - // case VOLUME_FRACTION: - // ObjFunc = solver[FEA_SOL]->GetTotal_OFVolFrac(); - // break; - // default: - // ObjFunc = 0.0; // If the objective function is computed in a different physical problem - // break; - // } + switch (config->GetKind_ObjFunc()){ + case REFERENCE_GEOMETRY: + ObjFunc = solver[FEA_SOL]->GetTotal_OFRefGeom(); + break; + case REFERENCE_NODE: + ObjFunc = solver[FEA_SOL]->GetTotal_OFRefNode(); + break; + case VOLUME_FRACTION: + case TOPOL_DISCRETENESS: + ObjFunc = solver[FEA_SOL]->GetTotal_OFVolFrac(); + break; + case TOPOL_COMPLIANCE: + ObjFunc = solver[FEA_SOL]->GetTotal_OFCompliance(); + break; + default: + ObjFunc = 0.0; // If the objective function is computed in a different physical problem + break; + } break; } - if ((config->GetKind_Solver() != DISC_ADJ_FEM) && (rank == MASTER_NODE)) { + if (rank == MASTER_NODE) { AD::RegisterOutput(ObjFunc); } From 4661f6bfad64a2ff51e2384d1862aa1638b8e18b Mon Sep 17 00:00:00 2001 From: cvencro Date: Tue, 1 Oct 2019 13:43:15 +0100 Subject: [PATCH 08/82] remove unsteady multizone overwrite default settings --- Common/src/config_structure.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Common/src/config_structure.cpp b/Common/src/config_structure.cpp index 62c68a51a64c..cac5fe8f2161 100644 --- a/Common/src/config_structure.cpp +++ b/Common/src/config_structure.cpp @@ -3322,19 +3322,19 @@ void CConfig::SetPostprocessing(unsigned short val_software, unsigned short val_ else Rotating_Frame = false; - /*--- THIS IS A TEMPORARY WORKAROUND to run the new multizone driver without adapting the config file. - * Will be removed soon. ---*/ - if (Multizone_Problem){ - if (Unsteady_Simulation != STEADY || Time_Domain == YES){ - if (Delta_UnstTime != 0){ - Time_Domain = YES; - Time_Iter = nExtIter; - Outer_Iter = Unst_nIntIter; - Inner_Iter = 1; - Time_Step = Delta_UnstTime; - } - } - } + // /*--- THIS IS A TEMPORARY WORKAROUND to run the new multizone driver without adapting the config file. + // * Will be removed soon. ---*/ + // if (Multizone_Problem){ + // if (Unsteady_Simulation != STEADY || Time_Domain == YES){ + // if (Delta_UnstTime != 0){ + // Time_Domain = YES; + // Time_Iter = nExtIter; + // Outer_Iter = Unst_nIntIter; + // Inner_Iter = 1; + // Time_Step = Delta_UnstTime; + // } + // } + // } /*--- In case the grid movement parameters have not been declared in the config file, set them equal to zero for safety. Also check to make sure From 95304578bec7835110a215966a615030cfb658bf Mon Sep 17 00:00:00 2001 From: cvencro Date: Wed, 9 Oct 2019 17:53:05 +0100 Subject: [PATCH 09/82] add option to use new mesh solver for FSI driver --- Common/src/config_structure.cpp | 4 +-- SU2_CFD/src/drivers/CDriver.cpp | 55 ++++++++++++++++++++++++++++++--- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/Common/src/config_structure.cpp b/Common/src/config_structure.cpp index cac5fe8f2161..a5284dba4672 100644 --- a/Common/src/config_structure.cpp +++ b/Common/src/config_structure.cpp @@ -4451,9 +4451,9 @@ void CConfig::SetPostprocessing(unsigned short val_software, unsigned short val_ Restart_Flow = false; - if (GetGrid_Movement()) { + /*if (GetGrid_Movement()) { SU2_MPI::Error("Dynamic mesh movement currently not supported for the discrete adjoint solver.", CURRENT_FUNCTION); - } + }*/ if (Unst_AdjointIter- long(nExtIter) < 0){ SU2_MPI::Error(string("Invalid iteration number requested for unsteady adjoint.\n" ) + diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index a1644bd57cd2..e825aad13bb9 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -4195,8 +4195,16 @@ void CFluidDriver::DynamicMeshUpdate(unsigned long ExtIter) { if ((config_container[iZone]->GetGrid_Movement()) && (!harmonic_balance)) { iteration_container[iZone][INST_0]->SetGrid_Movement(geometry_container[iZone][INST_0], surface_movement[iZone], grid_movement[iZone][INST_0], solver_container[iZone][INST_0], config_container[iZone], 0, ExtIter ); } + /*--- New solver - all the other routines in SetGrid_Movement should be adapted to this one ---*/ + /*--- Works if DEFORM_MESH = YES ---*/ + else if (config_container[iZone]->GetDeform_Mesh()) { + iteration_container[iZone][INST_0]->SetMesh_Deformation(geometry_container[iZone][INST_0], + solver_container[iZone][INST_0][MESH_0], + numerics_container[iZone][INST_0][MESH_0], + config_container[iZone], + NONE); + } } - } CTurbomachineryDriver::CTurbomachineryDriver(char* confFile, unsigned short val_nZone, @@ -5075,9 +5083,20 @@ void CFSIDriver::Run() { /*--------------------- Mesh deformation --------------------------*/ /*-----------------------------------------------------------------*/ + if (!config_container[ZONE_FLOW]->GetDeform_Mesh()) { iteration_container[ZONE_FLOW][INST_0]->SetGrid_Movement(geometry_container[ZONE_FLOW][INST_0], surface_movement[ZONE_FLOW], grid_movement[ZONE_FLOW][INST_0], solver_container[ZONE_FLOW][INST_0], config_container[ZONE_FLOW], 0, ExtIter ); + } + /*--- New solver - all the other routines in SetGrid_Movement should be adapted to this one ---*/ + /*--- Works if DEFORM_MESH = YES ---*/ + else { + iteration_container[ZONE_FLOW][INST_0]->SetMesh_Deformation(geometry_container[ZONE_FLOW][INST_0], + solver_container[ZONE_FLOW][INST_0][MESH_0], + numerics_container[ZONE_FLOW][INST_0][MESH_0], + config_container[ZONE_FLOW], + NONE); + } /*-----------------------------------------------------------------*/ /*-------------------- Fluid subiteration -------------------------*/ @@ -5217,10 +5236,17 @@ void CFSIDriver::Predict_Tractions(unsigned short donorZone, unsigned short targ void CFSIDriver::Transfer_Displacements(unsigned short donorZone, unsigned short targetZone) { + if (!config_container[donorZone]->GetDeform_Mesh()) { + interface_container[donorZone][targetZone]->BroadcastData(solver_container[donorZone][INST_0][MESH_0][FEA_SOL],solver_container[targetZone][INST_0][MESH_0][FLOW_SOL], geometry_container[donorZone][INST_0][MESH_0],geometry_container[targetZone][INST_0][MESH_0], config_container[donorZone], config_container[targetZone]); - + } + else { + interface_container[donorZone][targetZone]->BroadcastData(solver_container[donorZone][INST_0][MESH_0][FEA_SOL],solver_container[targetZone][INST_0][MESH_0][MESH_SOL], + geometry_container[donorZone][INST_0][MESH_0],geometry_container[targetZone][INST_0][MESH_0], + config_container[donorZone], config_container[targetZone]); + } } void CFSIDriver::Transfer_Tractions(unsigned short donorZone, unsigned short targetZone) { @@ -5393,10 +5419,20 @@ void CFSIDriver::Update() { /*-------------------- Set the grid movement -------------------------*/ - + if (!config_container[ZONE_FLOW]->GetDeform_Mesh()) { iteration_container[ZONE_FLOW][INST_0]->SetGrid_Movement(geometry_container[ZONE_FLOW][INST_0], surface_movement[ZONE_FLOW], grid_movement[ZONE_FLOW][INST_0], solver_container[ZONE_FLOW][INST_0], config_container[ZONE_FLOW], 0, ExtIter ); + } + /*--- New solver - all the other routines in SetGrid_Movement should be adapted to this one ---*/ + /*--- Works if DEFORM_MESH = YES ---*/ + else { + iteration_container[ZONE_FLOW][INST_0]->SetMesh_Deformation(geometry_container[ZONE_FLOW][INST_0], + solver_container[ZONE_FLOW][INST_0][MESH_0], + numerics_container[ZONE_FLOW][INST_0][MESH_0], + config_container[ZONE_FLOW], + NONE); + } /*--- TODO: Temporary output of objective function for Flow OFs. Needs to be integrated into the refurbished output ---*/ @@ -6248,10 +6284,21 @@ void CDiscAdjFSIDriver::Mesh_Deformation_Direct(unsigned short ZONE_FLOW, unsign /*---- as the flag Grid_Movement is set to false in this case -----*/ /*-----------------------------------------------------------------*/ + if (!config_container[ZONE_FLOW]->GetDeform_Mesh()) { direct_iteration[ZONE_FLOW]->SetGrid_Movement(geometry_container[ZONE_FLOW][INST_0], surface_movement[ZONE_FLOW], grid_movement[ZONE_FLOW][INST_0], solver_container[ZONE_FLOW][INST_0], config_container[ZONE_FLOW], 0, ExtIter ); - + } + /*--- New solver - all the other routines in SetGrid_Movement should be adapted to this one ---*/ + /*--- Works if DEFORM_MESH = YES ---*/ + else { + iteration_container[ZONE_FLOW][INST_0]->SetMesh_Deformation(geometry_container[ZONE_FLOW][INST_0], + solver_container[ZONE_FLOW][INST_0][MESH_0], + numerics_container[ZONE_FLOW][INST_0][MESH_0], + config_container[ZONE_FLOW], + NONE); + } + geometry_container[ZONE_FLOW][INST_0][MESH_0]->UpdateGeometry(geometry_container[ZONE_FLOW][INST_0], config_container[ZONE_FLOW]); solver_container[ZONE_STRUCT][INST_0][MESH_0][FEA_SOL]->InitiateComms(geometry_container[ZONE_STRUCT][INST_0][MESH_0], config_container[ZONE_STRUCT], SOLUTION_FEA); From 27f9fc1b3352c1c7d6ae4c53adf1fae48d7090a4 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 21 Oct 2019 00:32:11 +0100 Subject: [PATCH 10/82] Add output files for FSI discrete adjoint --- SU2_CFD/src/drivers/CDriver.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index 73a290536a33..308d13249633 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -5283,6 +5283,11 @@ void CDiscAdjFSIDriver::Run( ) { Postprocess(ZONE_FLOW, ZONE_STRUCT); + for (iZone = 0; iZone < nZone; iZone++){ + output_container[iZone]->SetResult_Files(geometry_container[iZone][INST_0][MESH_0], + config_container[iZone], + solver_container[iZone][INST_0][MESH_0], TimeIter, true); + } } From a0b73ca7b01708359ae0b2a126819ee85fa21596 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 21 Oct 2019 00:33:50 +0100 Subject: [PATCH 11/82] Add sensitivity output in CElasticityOutput.cpp --- SU2_CFD/src/output/CElasticityOutput.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/SU2_CFD/src/output/CElasticityOutput.cpp b/SU2_CFD/src/output/CElasticityOutput.cpp index f8677ac26306..d84770bcb8a7 100644 --- a/SU2_CFD/src/output/CElasticityOutput.cpp +++ b/SU2_CFD/src/output/CElasticityOutput.cpp @@ -184,6 +184,13 @@ void CElasticityOutput::LoadVolumeData(CConfig *config, CGeometry *geometry, CSo SetVolumeOutputValue("DISPLACEMENT-Y", iPoint, Node_Struc->GetSolution(iPoint, 1)); if (nDim == 3) SetVolumeOutputValue("DISPLACEMENT-Z", iPoint, Node_Struc->GetSolution(iPoint, 2)); + /*--- Load data for the discrete sensitivities. ---*/ + if (config->GetDiscrete_Adjoint()) { + SetVolumeOutputValue("SENSITIVITY-X", iPoint, Node_Struc->GetSensitivity(iPoint, 0)); + SetVolumeOutputValue("SENSITIVITY-Y", iPoint, Node_Struc->GetSensitivity(iPoint, 1)); + if (nDim == 3) SetVolumeOutputValue("SENSITIVITY-Z", iPoint, Node_Struc->GetSensitivity(iPoint, 2)); + } + if(dynamic){ SetVolumeOutputValue("VELOCITY-X", iPoint, Node_Struc->GetSolution_Vel(iPoint, 0)); SetVolumeOutputValue("VELOCITY-Y", iPoint, Node_Struc->GetSolution_Vel(iPoint, 1)); @@ -218,6 +225,14 @@ void CElasticityOutput::SetVolumeOutputFields(CConfig *config){ AddVolumeOutput("DISPLACEMENT-Y", "Displacement_y", "SOLUTION", "y-component of the displacement vector"); if (nDim == 3) AddVolumeOutput("DISPLACEMENT-Z", "Displacement_z", "SOLUTION", "z-component of the displacement vector"); + /*--- For the discrete adjoint, we have the full field of sensitivity + in each coordinate direction. ---*/ + if (config->GetDiscrete_Adjoint()) { + AddVolumeOutput("SENSITIVITY-X", "Sensitivity_x", "SENSITIVITY", "x-component of the coordinate sensitivity vector"); + AddVolumeOutput("SENSITIVITY-Y", "Sensitivity_y", "SENSITIVITY", "y-component of the coordinate sensitivity vector"); + if (nDim == 3) AddVolumeOutput("SENSITIVITY-Z", "Sensitivity_Z", "SENSITIVITY", "z-component of the coordinate sensitivity vector"); + } + if(dynamic){ AddVolumeOutput("VELOCITY-X", "Velocity_x", "VELOCITY", "x-component of the velocity vector"); AddVolumeOutput("VELOCITY-Y", "Velocity_y", "VELOCITY", "y-component of the velocity vector"); From d14851ec0ea5c606500c77f1bdf9b634566e6571 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 21 Oct 2019 11:19:01 +0100 Subject: [PATCH 12/82] Re-set up Run for dynamic FSI adjoint --- SU2_CFD/src/drivers/CDriver.cpp | 105 ++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 39 deletions(-) diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index 308d13249633..cb263aa4096b 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -5229,64 +5229,91 @@ void CDiscAdjFSIDriver::DynamicMeshUpdate(unsigned long ExtIter){ void CDiscAdjFSIDriver::Run( ) { - /*--- As of now, we are coding it for just 2 zones. ---*/ - /*--- This will become more general, but we need to modify the configuration for that ---*/ - unsigned short ZONE_FLOW = 0, ZONE_STRUCT = 1; - unsigned short iZone; - bool BGS_Converged = false; - unsigned long IntIter = 0; for (iZone = 0; iZone < nZone; iZone++) config_container[iZone]->SetInnerIter(IntIter); - unsigned long iOuterIter = 0; for (iZone = 0; iZone < nZone; iZone++) config_container[iZone]->SetOuterIter(iOuterIter); - unsigned long nOuterIter = driver_config->GetnOuter_Iter(); + while ( TimeIter < config_container[ZONE_0]->GetnTime_Iter()) { - ofstream myfile_struc, myfile_flow, myfile_geo; - - Preprocess(ZONE_FLOW, ZONE_STRUCT, ALL_VARIABLES); + /*--- Perform some external iteration preprocessing. ---*/ - for (iOuterIter = 0; iOuterIter < nOuterIter && !BGS_Converged; iOuterIter++){ + //PreprocessExtIter(TimeIter); + /*--- Set the value of the external iteration and physical time. ---*/ - if (rank == MASTER_NODE){ - cout << endl << " ****** BGS ITERATION "; - cout << iOuterIter; - cout << " ******" << endl; + for (iZone = 0; iZone < nZone; iZone++) { + config_container[iZone]->SetTimeIter(TimeIter); + + if (config_container[iZone]->GetTime_Domain()) + config_container[iZone]->SetPhysicalTime(static_cast(TimeIter)*config_container[iZone]->GetDelta_UnstTimeND()); + else + config_container[iZone]->SetPhysicalTime(0.0); + } - for (iZone = 0; iZone < nZone; iZone++) config_container[iZone]->SetOuterIter(iOuterIter); + /*--- As of now, we are coding it for just 2 zones. ---*/ + /*--- This will become more general, but we need to modify the configuration for that ---*/ + unsigned short ZONE_FLOW = 0, ZONE_STRUCT = 1; + unsigned short iZone; + bool BGS_Converged = false; + + unsigned long IntIter = 0; for (iZone = 0; iZone < nZone; iZone++) config_container[iZone]->SetInnerIter(IntIter); + unsigned long iOuterIter = 0; for (iZone = 0; iZone < nZone; iZone++) config_container[iZone]->SetOuterIter(iOuterIter); + unsigned long nOuterIter = driver_config->GetnOuter_Iter(); + + ofstream myfile_struc, myfile_flow, myfile_geo; - /*--- Start with structural terms if OF is based on displacements ---*/ + Preprocess(ZONE_FLOW, ZONE_STRUCT, ALL_VARIABLES); - if (Kind_Objective_Function == FEM_OBJECTIVE_FUNCTION) - Iterate_Block(ZONE_FLOW, ZONE_STRUCT, FEA_DISP_VARS); + // /*--- Perform a dynamic mesh update if required. ---*/ - /*--- Iterate fluid (including cross term) ---*/ + // if (!fem_solver && !(config_container[ZONE_0]->GetGrid_Movement() && config_container[ZONE_0]->GetDiscrete_Adjoint())) { + // DynamicMeshUpdate(TimeIter); + // } - Iterate_Block(ZONE_FLOW, ZONE_STRUCT, FLOW_CONS_VARS); + for (iOuterIter = 0; iOuterIter < nOuterIter && !BGS_Converged; iOuterIter++){ - /*--- Compute mesh (it is a cross term dF / dMv ) ---*/ + if (rank == MASTER_NODE){ + cout << endl << " ****** BGS ITERATION "; + cout << iOuterIter; + cout << " ******" << endl; + } - Iterate_Block(ZONE_FLOW, ZONE_STRUCT, MESH_COORDS); + for (iZone = 0; iZone < nZone; iZone++) config_container[iZone]->SetOuterIter(iOuterIter); + + /*--- Start with structural terms if OF is based on displacements ---*/ - /*--- Compute mesh cross term (dM / dSv) ---*/ + if (Kind_Objective_Function == FEM_OBJECTIVE_FUNCTION) + Iterate_Block(ZONE_FLOW, ZONE_STRUCT, FEA_DISP_VARS); - Iterate_Block(ZONE_FLOW, ZONE_STRUCT, FEM_CROSS_TERM_GEOMETRY); - - /*--- End with structural terms if OF is based on fluid variables ---*/ - - if (Kind_Objective_Function == FLOW_OBJECTIVE_FUNCTION) - Iterate_Block(ZONE_FLOW, ZONE_STRUCT, FEA_DISP_VARS); + /*--- Iterate fluid (including cross term) ---*/ - /*--- Check convergence of the BGS method ---*/ - BGS_Converged = BGSConvergence(iOuterIter, ZONE_FLOW, ZONE_STRUCT); + Iterate_Block(ZONE_FLOW, ZONE_STRUCT, FLOW_CONS_VARS); - } + /*--- Compute mesh (it is a cross term dF / dMv ) ---*/ + Iterate_Block(ZONE_FLOW, ZONE_STRUCT, MESH_COORDS); - Postprocess(ZONE_FLOW, ZONE_STRUCT); + /*--- Compute mesh cross term (dM / dSv) ---*/ - for (iZone = 0; iZone < nZone; iZone++){ - output_container[iZone]->SetResult_Files(geometry_container[iZone][INST_0][MESH_0], - config_container[iZone], - solver_container[iZone][INST_0][MESH_0], TimeIter, true); + Iterate_Block(ZONE_FLOW, ZONE_STRUCT, FEM_CROSS_TERM_GEOMETRY); + + /*--- End with structural terms if OF is based on fluid variables ---*/ + + if (Kind_Objective_Function == FLOW_OBJECTIVE_FUNCTION) + Iterate_Block(ZONE_FLOW, ZONE_STRUCT, FEA_DISP_VARS); + + /*--- Check convergence of the BGS method ---*/ + BGS_Converged = BGSConvergence(iOuterIter, ZONE_FLOW, ZONE_STRUCT); + + } + + + Postprocess(ZONE_FLOW, ZONE_STRUCT); + + for (iZone = 0; iZone < nZone; iZone++){ + output_container[iZone]->SetResult_Files(geometry_container[iZone][INST_0][MESH_0], + config_container[iZone], + solver_container[iZone][INST_0][MESH_0], TimeIter, true); + } + + TimeIter++; } } From 79293d5fa7a35924a4f6a34c47a2f76990a6e57d Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 21 Oct 2019 11:21:00 +0100 Subject: [PATCH 13/82] Fix setting of dynamic fluid adjoint iteration number for output file --- SU2_CFD/src/iteration_structure.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 9c06fd6890c7..74f8e7873e9f 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -604,7 +604,8 @@ void CFluidIteration::Iterate(COutput *output, } } - + + Monitor(output, integration, geometry, solver, numerics, config, surface_movement, grid_movement, FFDBox, val_iZone, INST_0); } void CFluidIteration::Update(COutput *output, From 7fc84bbea0bcd31a75ff906191389832a62023ef Mon Sep 17 00:00:00 2001 From: cr109 Date: Tue, 12 Nov 2019 09:09:02 +0000 Subject: [PATCH 14/82] fixes for unsteady restart and sensitivity output --- SU2_CFD/src/drivers/CDriver.cpp | 5 ++++- SU2_CFD/src/output/CAdjElasticityOutput.cpp | 17 +++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index d948d3138234..e225be6c68a5 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -1522,7 +1522,10 @@ void CDriver::Solver_Restart(CSolver ***solver, CGeometry **geometry, solver[MESH_0][TURB_SOL]->LoadRestart(geometry, solver, config, val_iter, update_geo); } if (fem) { - if (time_domain) val_iter = SU2_TYPE::Int(config->GetRestart_Iter())-1; + if (time_domain) { + if (config->GetRestart()) val_iter = SU2_TYPE::Int(config->GetRestart_Iter())-1; + else val_iter = SU2_TYPE::Int(config->GetUnst_AdjointIter())-1; + } solver[MESH_0][FEA_SOL]->LoadRestart(geometry, solver, config, val_iter, update_geo); } if (fem_euler || fem_ns) { diff --git a/SU2_CFD/src/output/CAdjElasticityOutput.cpp b/SU2_CFD/src/output/CAdjElasticityOutput.cpp index a4dc777710cf..0c73efbb46ed 100644 --- a/SU2_CFD/src/output/CAdjElasticityOutput.cpp +++ b/SU2_CFD/src/output/CAdjElasticityOutput.cpp @@ -154,6 +154,10 @@ void CAdjElasticityOutput::LoadVolumeData(CConfig *config, CGeometry *geometry, if (nVar_FEM == 3) SetVolumeOutputValue("ADJOINT-Z", iPoint, Node_Struc->GetSolution(iPoint, 2)); + /*--- Load data for the discrete sensitivities. ---*/ + SetVolumeOutputValue("SENSITIVITY-X", iPoint, Node_Struc->GetSensitivity(iPoint, 0)); + SetVolumeOutputValue("SENSITIVITY-Y", iPoint, Node_Struc->GetSensitivity(iPoint, 1)); + if (nVar_FEM == 3) SetVolumeOutputValue("SENSITIVITY-Z", iPoint, Node_Struc->GetSensitivity(iPoint, 2)); } void CAdjElasticityOutput::SetVolumeOutputFields(CConfig *config){ @@ -174,8 +178,13 @@ void CAdjElasticityOutput::SetVolumeOutputFields(CConfig *config){ AddVolumeOutput("ADJOINT-Z", "Adjoint_z", "SOLUTION", "adjoint of displacement in the z direction"); /// END_GROUP - /// BEGIN_GROUP: SENSITIVITY, DESCRIPTION: Geometrical sensitivities of the current objective function. - /// DESCRIPTION: Sensitivity in normal direction. - AddVolumeOutput("SENSITIVITY", "Surface_Sensitivity", "SENSITIVITY", "sensitivity in normal direction"); - /// END_GROUP + /*--- Full field of sensitivity in each coordinate direction. ---*/ + AddVolumeOutput("SENSITIVITY-X", "Sensitivity_x", "SENSITIVITY", "x-component of the coordinate sensitivity vector"); + AddVolumeOutput("SENSITIVITY-Y", "Sensitivity_y", "SENSITIVITY", "y-component of the coordinate sensitivity vector"); + if (nVar_FEM == 3) AddVolumeOutput("SENSITIVITY-Z", "Sensitivity_Z", "SENSITIVITY", "z-component of the coordinate sensitivity vector"); + + // /// BEGIN_GROUP: SENSITIVITY, DESCRIPTION: Geometrical sensitivities of the current objective function. + // /// DESCRIPTION: Sensitivity in normal direction. + // AddVolumeOutput("SENSITIVITY", "Surface_Sensitivity", "SENSITIVITY", "sensitivity in normal direction"); + // /// END_GROUP } From 1830be58d8392ed887f7d24a3c27baceeaf24dac Mon Sep 17 00:00:00 2001 From: cr109 Date: Tue, 12 Nov 2019 13:13:06 +0000 Subject: [PATCH 15/82] fix unsteady restart filename for discrete adjoint --- SU2_CFD/src/drivers/CDriver.cpp | 3 ++- SU2_CFD/src/solvers/CMeshSolver.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index e225be6c68a5..b5092f0ddd34 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -1568,7 +1568,8 @@ void CDriver::Solver_Restart(CSolver ***solver, CGeometry **geometry, if ((restart || restart_flow) && config->GetDeform_Mesh() && update_geo){ /*--- Always restart with the last state ---*/ - val_iter = SU2_TYPE::Int(config->GetRestart_Iter())-1; + if (config->GetRestart()) val_iter = SU2_TYPE::Int(config->GetRestart_Iter())-1; + else val_iter = SU2_TYPE::Int(config->GetUnst_AdjointIter())-1; solver[MESH_0][MESH_SOL]->LoadRestart(geometry, solver, config, val_iter, update_geo); } diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index a68d8224bc41..b03a99872c42 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -837,7 +837,8 @@ void CMeshSolver::Restart_OldGeometry(CGeometry *geometry, CConfig *config) { /*-------------------------------------------------------------------------------------------*/ /*--- Modify file name for an unsteady restart ---*/ - Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter())-1; + if (config->GetRestart()) Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter())-1; + else Unst_RestartIter = SU2_TYPE::Int(config->GetUnst_AdjointIter())-1; filename_n = config->GetUnsteady_FileName(filename, Unst_RestartIter, ""); /*--- Read the restart data from either an ASCII or binary SU2 file. ---*/ @@ -913,7 +914,8 @@ void CMeshSolver::Restart_OldGeometry(CGeometry *geometry, CConfig *config) { rbuf_NotMatching = 0; sbuf_NotMatching = 0; /*--- Modify file name for an unsteady restart ---*/ - Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter())-2; + if (config->GetRestart()) Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter())-2; + else Unst_RestartIter = SU2_TYPE::Int(config->GetUnst_AdjointIter())-2; filename_n1 = config->GetUnsteady_FileName(filename, Unst_RestartIter, ""); /*--- Read the restart data from either an ASCII or binary SU2 file. ---*/ From e3de59a5523e166194c4867ba372d8871d2c84c2 Mon Sep 17 00:00:00 2001 From: cr109 Date: Thu, 14 Nov 2019 04:37:45 +0000 Subject: [PATCH 16/82] remove additional deformation calls --- SU2_CFD/src/drivers/CDriver.cpp | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index b5092f0ddd34..b6e3a8083a69 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -4130,15 +4130,6 @@ void CFluidDriver::DynamicMeshUpdate(unsigned long TimeIter) { if ((config_container[iZone]->GetGrid_Movement()) && (!harmonic_balance)) { iteration_container[iZone][INST_0]->SetGrid_Movement(geometry_container[iZone][INST_0], surface_movement[iZone], grid_movement[iZone][INST_0], solver_container[iZone][INST_0], config_container[iZone], 0, TimeIter ); } - /*--- New solver - all the other routines in SetGrid_Movement should be adapted to this one ---*/ - /*--- Works if DEFORM_MESH = YES ---*/ - else if (config_container[iZone]->GetDeform_Mesh()) { - iteration_container[iZone][INST_0]->SetMesh_Deformation(geometry_container[iZone][INST_0], - solver_container[iZone][INST_0][MESH_0], - numerics_container[iZone][INST_0][MESH_0], - config_container[iZone], - NONE); - } } } bool CFluidDriver::Monitor(unsigned long ExtIter) { @@ -5856,20 +5847,9 @@ void CDiscAdjFSIDriver::Mesh_Deformation_Direct(unsigned short ZONE_FLOW, unsign /*---- as the flag Grid_Movement is set to false in this case -----*/ /*-----------------------------------------------------------------*/ - if (!config_container[ZONE_FLOW]->GetDeform_Mesh()) { direct_iteration[ZONE_FLOW]->SetGrid_Movement(geometry_container[ZONE_FLOW][INST_0], surface_movement[ZONE_FLOW], grid_movement[ZONE_FLOW][INST_0], solver_container[ZONE_FLOW][INST_0], config_container[ZONE_FLOW], 0, ExtIter ); - } - /*--- New solver - all the other routines in SetGrid_Movement should be adapted to this one ---*/ - /*--- Works if DEFORM_MESH = YES ---*/ - else { - iteration_container[ZONE_FLOW][INST_0]->SetMesh_Deformation(geometry_container[ZONE_FLOW][INST_0], - solver_container[ZONE_FLOW][INST_0][MESH_0], - numerics_container[ZONE_FLOW][INST_0][MESH_0], - config_container[ZONE_FLOW], - NONE); - } geometry_container[ZONE_FLOW][INST_0][MESH_0]->UpdateGeometry(geometry_container[ZONE_FLOW][INST_0], config_container[ZONE_FLOW]); From 09db60eb9c9395ce94717b9503da3ebf7d331cbf Mon Sep 17 00:00:00 2001 From: cvencro Date: Fri, 15 Nov 2019 16:50:20 +0000 Subject: [PATCH 17/82] small changes to run multizone for dynamic fsi with CMeshSolver --- SU2_CFD/src/SU2_CFD.cpp | 2 +- SU2_CFD/src/solver_direct_mean.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SU2_CFD/src/SU2_CFD.cpp b/SU2_CFD/src/SU2_CFD.cpp index e0efd2f0cfd5..c5528c9eadf3 100644 --- a/SU2_CFD/src/SU2_CFD.cpp +++ b/SU2_CFD/src/SU2_CFD.cpp @@ -123,7 +123,7 @@ int main(int argc, char *argv[]) { driver = new CSinglezoneDriver(config_file_name, nZone, MPICommunicator); } - else if (config->GetMultizone_Problem() && !turbo && !fsi) { + else if (config->GetMultizone_Problem() && !turbo){// && !fsi) { /*--- Multizone Drivers. ---*/ diff --git a/SU2_CFD/src/solver_direct_mean.cpp b/SU2_CFD/src/solver_direct_mean.cpp index 7364a06ec1ca..92dd5d2388cf 100644 --- a/SU2_CFD/src/solver_direct_mean.cpp +++ b/SU2_CFD/src/solver_direct_mean.cpp @@ -4177,7 +4177,7 @@ void CEulerSolver::Pressure_Forces(CGeometry *geometry, CConfig *config) { RefTemp = Temperature_Inf; RefDensity = Density_Inf; RefPressure = Pressure_Inf; - if (dynamic_grid) { + if (dynamic_grid && !config->GetFSI_Simulation()) { Mach2Vel = sqrt(Gamma*Gas_Constant*RefTemp); Mach_Motion = config->GetMach_Motion(); RefVel2 = (Mach_Motion*Mach2Vel)*(Mach_Motion*Mach2Vel); From 7ed8e866b7019d4bff688894a4cf3b424eed92ea Mon Sep 17 00:00:00 2001 From: cvencro Date: Sat, 16 Nov 2019 04:36:47 +0000 Subject: [PATCH 18/82] add framework for dynamic simulation with multizone discrete adjoint driver --- .../src/drivers/CDiscAdjMultizoneDriver.cpp | 237 +++++++++--------- SU2_CFD/src/solver_adjoint_elasticity.cpp | 9 +- 2 files changed, 129 insertions(+), 117 deletions(-) diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index bec4753823b2..7814d5281dd6 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -119,9 +119,9 @@ void CDiscAdjMultizoneDriver::StartSolver() { cout << "\nSimulation Run using the Discrete Adjoint Multizone Driver" << endl; - if (driver_config->GetTime_Domain()) - SU2_MPI::Error("The discrete adjoint multizone driver is not ready for unsteady computations yet.", - CURRENT_FUNCTION); + // if (driver_config->GetTime_Domain()) + // SU2_MPI::Error("The discrete adjoint multizone driver is not ready for unsteady computations yet.", + // CURRENT_FUNCTION); } for (iZone = 0; iZone < nZone; iZone++){ @@ -140,10 +140,6 @@ void CDiscAdjMultizoneDriver::StartSolver() { Run(); - /*--- Output the solution in files. ---*/ - - Output(TimeIter); - } void CDiscAdjMultizoneDriver::Run() { @@ -151,166 +147,185 @@ void CDiscAdjMultizoneDriver::Run() { unsigned long wrt_sol_freq = 9999; unsigned long nOuterIter = driver_config->GetnOuter_Iter(); - for (iZone = 0; iZone < nZone; iZone++) { + while ( TimeIter < driver_config->GetnTime_Iter()) { - wrt_sol_freq = min(wrt_sol_freq, config_container[iZone]->GetVolume_Wrt_Freq()); + for (iZone = 0; iZone < nZone; iZone++) { - iteration_container[iZone][INST_0]->Preprocess(output_container[iZone], integration_container, geometry_container, - solver_container, numerics_container, config_container, surface_movement, - grid_movement, FFDBox, iZone, INST_0); + /*--- Set current time iteration ---*/ + config_container[iZone]->SetTimeIter(TimeIter); - /*--- Set BGS_Solution_k to Solution. ---*/ + if (config_container[iZone]->GetTime_Domain()) + config_container[iZone]->SetPhysicalTime(static_cast(TimeIter)*config_container[iZone]->GetDelta_UnstTimeND()); + else + config_container[iZone]->SetPhysicalTime(0.0); + } + for (iZone = 0; iZone < nZone; iZone++) { - Set_BGSSolution(iZone); - } + wrt_sol_freq = min(wrt_sol_freq, config_container[iZone]->GetVolume_Wrt_Freq()); - /*--- Evaluate the objective function gradient w.r.t. the solutions of all zones. ---*/ + iteration_container[iZone][INST_0]->Preprocess(output_container[iZone], integration_container, geometry_container, + solver_container, numerics_container, config_container, surface_movement, + grid_movement, FFDBox, iZone, INST_0); - SetRecording(NONE, Kind_Tape::FULL_TAPE, ZONE_0); - SetRecording(FLOW_CONS_VARS, Kind_Tape::OBJECTIVE_FUNCTION_TAPE, ZONE_0); - RecordingState = NONE; + /*--- Set BGS_Solution_k to Solution. ---*/ - AD::ClearAdjoints(); - SetAdj_ObjFunction(); - AD::ComputeAdjoint(OBJECTIVE_FUNCTION, START); + Set_BGSSolution(iZone); + } - /*--- Initialize External with the objective function gradient. ---*/ + /*--- Evaluate the objective function gradient w.r.t. the solutions of all zones. ---*/ - for (iZone = 0; iZone < nZone; iZone++) { + SetRecording(NONE, Kind_Tape::FULL_TAPE, ZONE_0); + SetRecording(FLOW_CONS_VARS, Kind_Tape::OBJECTIVE_FUNCTION_TAPE, ZONE_0); + RecordingState = NONE; - iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, - solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, iZone, INST_0); - Add_Solution_To_External(iZone); - } + AD::ClearAdjoints(); + SetAdj_ObjFunction(); + AD::ComputeAdjoint(OBJECTIVE_FUNCTION, START); - /*--- Loop over the number of outer iterations. ---*/ + /*--- Initialize External with the objective function gradient. ---*/ - for (unsigned long iOuterIter = 0, StopCalc = false; !StopCalc; iOuterIter++) { + for (iZone = 0; iZone < nZone; iZone++) { - driver_config->SetOuterIter(iOuterIter); + iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, + solver_container, numerics_container, config_container, + surface_movement, grid_movement, FFDBox, iZone, INST_0); + Add_Solution_To_External(iZone); + } - for (iZone = 0; iZone < nZone; iZone++) - config_container[iZone]->SetOuterIter(iOuterIter); + /*--- Loop over the number of outer iterations. ---*/ - /*--- For the adjoint iteration we need the derivatives of the iteration function with - * respect to the state (and possibly the mesh coordinate) variables. - * Since these derivatives do not change in the steady state case we only have to record - * if the current recording is different from them. - * - * To set the tape appropriately, the following recording methods are provided: - * (1) NONE: All information from a previous recording is removed. - * (2) FLOW_CONS_VARS: State variables of all solvers in a zone as input. - * (3) MESH_COORDS: Mesh coordinates as input. - * (4) COMBINED: Mesh coordinates and state variables as input. - * - * By default, all (state and mesh coordinate variables) will be declared as output, - * since it does not change the computational effort. ---*/ + for (unsigned long iOuterIter = 0, StopCalc = false; !StopCalc; iOuterIter++) { + driver_config->SetOuterIter(iOuterIter); - /*--- If we want to set up zone-specific tapes (retape), we do not need to record - * here. Otherwise, the whole tape of a coupled run will be created. ---*/ + for (iZone = 0; iZone < nZone; iZone++) + config_container[iZone]->SetOuterIter(iOuterIter); - if (!retape && (RecordingState != FLOW_CONS_VARS)) { - SetRecording(NONE, Kind_Tape::FULL_TAPE, ZONE_0); - SetRecording(FLOW_CONS_VARS, Kind_Tape::FULL_TAPE, ZONE_0); - } + /*--- For the adjoint iteration we need the derivatives of the iteration function with + * respect to the state (and possibly the mesh coordinate) variables. + * Since these derivatives do not change in the steady state case we only have to record + * if the current recording is different from them. + * + * To set the tape appropriately, the following recording methods are provided: + * (1) NONE: All information from a previous recording is removed. + * (2) FLOW_CONS_VARS: State variables of all solvers in a zone as input. + * (3) MESH_COORDS: Mesh coordinates as input. + * (4) COMBINED: Mesh coordinates and state variables as input. + * + * By default, all (state and mesh coordinate variables) will be declared as output, + * since it does not change the computational effort. ---*/ - /*-- Start loop over zones. ---*/ - for (iZone = 0; iZone < nZone; iZone++) { + /*--- If we want to set up zone-specific tapes (retape), we do not need to record + * here. Otherwise, the whole tape of a coupled run will be created. ---*/ - if (retape) { + if (!retape && (RecordingState != FLOW_CONS_VARS)) { SetRecording(NONE, Kind_Tape::FULL_TAPE, ZONE_0); - SetRecording(FLOW_CONS_VARS, Kind_Tape::ZONE_SPECIFIC_TAPE, iZone); + SetRecording(FLOW_CONS_VARS, Kind_Tape::FULL_TAPE, ZONE_0); } - /*--- Start inner iterations from where we stopped in previous outer iteration. ---*/ + /*-- Start loop over zones. ---*/ - Set_Solution_To_BGSSolution(iZone); + for (iZone = 0; iZone < nZone; iZone++) { - /*--- Inner loop to allow for multiple adjoint updates with respect to solvers in iZone. ---*/ + if (retape) { + SetRecording(NONE, Kind_Tape::FULL_TAPE, ZONE_0); + SetRecording(FLOW_CONS_VARS, Kind_Tape::ZONE_SPECIFIC_TAPE, iZone); + } - bool eval_transfer = false; + /*--- Start inner iterations from where we stopped in previous outer iteration. ---*/ - for (unsigned short iInnerIter = 0; iInnerIter < nInnerIter[iZone]; iInnerIter++) { + Set_Solution_To_BGSSolution(iZone); - config_container[iZone]->SetInnerIter(iInnerIter); + /*--- Inner loop to allow for multiple adjoint updates with respect to solvers in iZone. ---*/ - /*--- Add off-diagonal contribution (including the OF gradient) to Solution. ---*/ + bool eval_transfer = false; - Add_External_To_Solution(iZone); + for (unsigned short iInnerIter = 0; iInnerIter < nInnerIter[iZone]; iInnerIter++) { - /*--- Evaluate the tape section belonging to solvers in iZone. - * Only evaluate TRANSFER terms on the last iteration or after convergence. ---*/ + config_container[iZone]->SetInnerIter(iInnerIter); - eval_transfer = eval_transfer || (iInnerIter == nInnerIter[iZone]-1); + /*--- Add off-diagonal contribution (including the OF gradient) to Solution. ---*/ - ComputeAdjoints(iZone, eval_transfer); + Add_External_To_Solution(iZone); - /*--- Extracting adjoints for solvers in iZone w.r.t. to outputs in iZone (diagonal part). ---*/ + /*--- Evaluate the tape section belonging to solvers in iZone. + * Only evaluate TRANSFER terms on the last iteration or after convergence. ---*/ - iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, - solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, iZone, INST_0); + eval_transfer = eval_transfer || (iInnerIter == nInnerIter[iZone]-1); - /*--- Print out the convergence data to screen and history file ---*/ + ComputeAdjoints(iZone, eval_transfer); - bool converged = iteration_container[iZone][INST_0]->Monitor(output_container[iZone], integration_container, - geometry_container, solver_container, numerics_container, - config_container, surface_movement, grid_movement, FFDBox, iZone, INST_0); - if (eval_transfer) break; - eval_transfer = converged; + /*--- Extracting adjoints for solvers in iZone w.r.t. to outputs in iZone (diagonal part). ---*/ - } + iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, + solver_container, numerics_container, config_container, + surface_movement, grid_movement, FFDBox, iZone, INST_0); - /*--- Off-diagonal (coupling term) BGS update. ---*/ + /*--- Print out the convergence data to screen and history file ---*/ - for (unsigned short jZone = 0; jZone < nZone; jZone++) { + bool converged = iteration_container[iZone][INST_0]->Monitor(output_container[iZone], integration_container, + geometry_container, solver_container, numerics_container, + config_container, surface_movement, grid_movement, FFDBox, iZone, INST_0); + if (eval_transfer) break; + eval_transfer = converged; - if (jZone != iZone && interface_container[jZone][iZone] != NULL) { + } - /*--- Extracting adjoints for solvers in jZone w.r.t. to the output of all solvers in iZone, - * that is, for the cases iZone != jZone we are evaluating cross derivatives between zones. ---*/ + /*--- Off-diagonal (coupling term) BGS update. ---*/ - iteration_container[jZone][INST_0]->Iterate(output_container[jZone], integration_container, geometry_container, - solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, jZone, INST_0); + for (unsigned short jZone = 0; jZone < nZone; jZone++) { + + if (jZone != iZone && interface_container[jZone][iZone] != NULL) { - /*--- Extract the cross-term performing a relaxed update of it and of the sum (External) for jZone. ---*/ + /*--- Extracting adjoints for solvers in jZone w.r.t. to the output of all solvers in iZone, + * that is, for the cases iZone != jZone we are evaluating cross derivatives between zones. ---*/ - Update_Cross_Term(iZone, jZone); + iteration_container[jZone][INST_0]->Iterate(output_container[jZone], integration_container, geometry_container, + solver_container, numerics_container, config_container, + surface_movement, grid_movement, FFDBox, jZone, INST_0); + + /*--- Extract the cross-term performing a relaxed update of it and of the sum (External) for jZone. ---*/ + + Update_Cross_Term(iZone, jZone); + } } - } - /*--- Save Solution to Solution_BGS and compute residual from Solution_BGS and Solution_BGS_k. ---*/ + /*--- Save Solution to Solution_BGS and compute residual from Solution_BGS and Solution_BGS_k. ---*/ - SetResidual_BGS(iZone); + SetResidual_BGS(iZone); - /*--- Save Solution to Solution_BGS_k for a next outer iteration. - * (Solution might be overwritten when entering another zone because of cross derivatives.) ---*/ + /*--- Save Solution to Solution_BGS_k for a next outer iteration. + * (Solution might be overwritten when entering another zone because of cross derivatives.) ---*/ - Set_BGSSolution(iZone); - } + Set_BGSSolution(iZone); + } - /*--- Set the multizone output. ---*/ + /*--- Set the multizone output. ---*/ - driver_output->SetMultizoneHistory_Output(output_container, config_container, driver_config, 0, iOuterIter); + driver_output->SetMultizoneHistory_Output(output_container, config_container, driver_config, 0, iOuterIter); - /*--- Check for convergence. ---*/ + /*--- Check for convergence. ---*/ - StopCalc = driver_output->GetConvergence() || (iOuterIter == nOuterIter-1); + StopCalc = driver_output->GetConvergence() || (iOuterIter == nOuterIter-1); - /*--- Clear the stored adjoint information to be ready for a new evaluation. ---*/ + /*--- Clear the stored adjoint information to be ready for a new evaluation. ---*/ - AD::ClearAdjoints(); + AD::ClearAdjoints(); + + /*--- Compute the geometrical sensitivities and write them to file. ---*/ + + bool checkSensitivity = StopCalc || ((iOuterIter % wrt_sol_freq == 0) && (iOuterIter != 0)); - /*--- Compute the geometrical sensitivities and write them to file. ---*/ + if (checkSensitivity) + EvaluateSensitivities(iOuterIter, StopCalc); + } + + /*--- Output the solution in files for each time iteration. ---*/ - bool checkSensitivity = StopCalc || ((iOuterIter % wrt_sol_freq == 0) && (iOuterIter != 0)); + Output(TimeIter); - if (checkSensitivity) - EvaluateSensitivities(iOuterIter, StopCalc); + TimeIter++; } } @@ -387,12 +402,6 @@ void CDiscAdjMultizoneDriver::EvaluateSensitivities(unsigned long iOuterIter, bo AD::ClearAdjoints(); - for (iZone = 0; iZone < nZone; iZone++) { - - output_container[iZone]->SetResult_Files(geometry_container[iZone][INST_0][MESH_0], - config_container[iZone], - solver_container[iZone][INST_0][MESH_0], iOuterIter, StopCalc); - } } void CDiscAdjMultizoneDriver::SetRecording(unsigned short kind_recording, Kind_Tape tape_type, unsigned short record_zone) { @@ -758,7 +767,7 @@ void CDiscAdjMultizoneDriver::SetObjFunction(unsigned short kind_recording) { void CDiscAdjMultizoneDriver::SetAdj_ObjFunction() { - bool TimeDomain = config_container[ZONE_0]->GetTime_Marching() != STEADY; + bool TimeDomain = config_container[ZONE_0]->GetTime_Domain(); unsigned long IterAvg_Obj = config_container[ZONE_0]->GetIter_Avg_Objective(); su2double seeding = 1.0; diff --git a/SU2_CFD/src/solver_adjoint_elasticity.cpp b/SU2_CFD/src/solver_adjoint_elasticity.cpp index 4476910d26e3..31cd8e98fbc0 100644 --- a/SU2_CFD/src/solver_adjoint_elasticity.cpp +++ b/SU2_CFD/src/solver_adjoint_elasticity.cpp @@ -971,6 +971,7 @@ void CDiscAdjFEASolver::ExtractAdjoint_CrossTerm_Geometry(CGeometry *geometry, C void CDiscAdjFEASolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CConfig *config){ + bool time_domain = config->GetTime_Domain(); unsigned short iVar; for (iVar = 0; iVar < nMPROP; iVar++){ @@ -979,7 +980,6 @@ void CDiscAdjFEASolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CC Total_Sens_Rho[iVar] += Global_Sens_Rho[iVar]; Total_Sens_Rho_DL[iVar] += Global_Sens_Rho_DL[iVar]; } - if (de_effects){ for (iVar = 0; iVar < nEField; iVar++) Total_Sens_EField[iVar]+= Global_Sens_EField[iVar]; @@ -1006,8 +1006,11 @@ void CDiscAdjFEASolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CC /*--- Set the index manually to zero. ---*/ AD::ResetInput(Coord[iDim]); } - - nodes->SetSensitivity(iPoint, iDim, Sensitivity); + if (!time_domain) { + nodes->SetSensitivity(iPoint, iDim, Sensitivity); + } else { + nodes->SetSensitivity(iPoint, iDim, nodes->GetSensitivity(iPoint, iDim) + Sensitivity); + } } } SetSurface_Sensitivity(geometry, config); From 1b974acd4f9a47d640a344e27186a1764eff5d7b Mon Sep 17 00:00:00 2001 From: cvencro Date: Sat, 16 Nov 2019 11:21:47 +0000 Subject: [PATCH 19/82] Add note about unsteady default output frequency --- SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index 7814d5281dd6..57269b10a759 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -161,6 +161,7 @@ void CDiscAdjMultizoneDriver::Run() { } for (iZone = 0; iZone < nZone; iZone++) { + /*** Note that for unsteady cases, if OUTPUT_WRT_FREQ is not defined, default is 1 ---*/ wrt_sol_freq = min(wrt_sol_freq, config_container[iZone]->GetVolume_Wrt_Freq()); iteration_container[iZone][INST_0]->Preprocess(output_container[iZone], integration_container, geometry_container, From 321b37423bf0314e3fb48da957decb4143c8d9d5 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 17 Nov 2019 09:32:05 +0000 Subject: [PATCH 20/82] fix time iteration outputs --- SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index 57269b10a759..bb0fdc1ae827 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -146,6 +146,7 @@ void CDiscAdjMultizoneDriver::Run() { unsigned long wrt_sol_freq = 9999; unsigned long nOuterIter = driver_config->GetnOuter_Iter(); + bool time_domain = driver_config->GetTime_Domain(); while ( TimeIter < driver_config->GetnTime_Iter()) { @@ -161,8 +162,8 @@ void CDiscAdjMultizoneDriver::Run() { } for (iZone = 0; iZone < nZone; iZone++) { - /*** Note that for unsteady cases, if OUTPUT_WRT_FREQ is not defined, default is 1 ---*/ - wrt_sol_freq = min(wrt_sol_freq, config_container[iZone]->GetVolume_Wrt_Freq()); + if (!time_domain) + wrt_sol_freq = min(wrt_sol_freq, config_container[iZone]->GetVolume_Wrt_Freq()); iteration_container[iZone][INST_0]->Preprocess(output_container[iZone], integration_container, geometry_container, solver_container, numerics_container, config_container, surface_movement, @@ -258,7 +259,7 @@ void CDiscAdjMultizoneDriver::Run() { ComputeAdjoints(iZone, eval_transfer); /*--- Extracting adjoints for solvers in iZone w.r.t. to outputs in iZone (diagonal part). ---*/ - + cout << "CVC: Debug: iteration_container["<< iZone << "][" << INST_0 << "]->Iterate" << endl; iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, solver_container, numerics_container, config_container, surface_movement, grid_movement, FFDBox, iZone, INST_0); @@ -304,7 +305,7 @@ void CDiscAdjMultizoneDriver::Run() { /*--- Set the multizone output. ---*/ - driver_output->SetMultizoneHistory_Output(output_container, config_container, driver_config, 0, iOuterIter); + driver_output->SetMultizoneHistory_Output(output_container, config_container, driver_config, TimeIter, iOuterIter); /*--- Check for convergence. ---*/ From b0fd2dff7b9d08515e43022693466d107113d911 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 17 Nov 2019 20:21:07 +0000 Subject: [PATCH 21/82] fix needed to run with legacy driver --- SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp | 1 - SU2_CFD/src/output/COutput.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index bb0fdc1ae827..c8087ab092c9 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -259,7 +259,6 @@ void CDiscAdjMultizoneDriver::Run() { ComputeAdjoints(iZone, eval_transfer); /*--- Extracting adjoints for solvers in iZone w.r.t. to outputs in iZone (diagonal part). ---*/ - cout << "CVC: Debug: iteration_container["<< iZone << "][" << INST_0 << "]->Iterate" << endl; iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, solver_container, numerics_container, config_container, surface_movement, grid_movement, FFDBox, iZone, INST_0); diff --git a/SU2_CFD/src/output/COutput.cpp b/SU2_CFD/src/output/COutput.cpp index 81adbdb5dde7..eb649ddf3c45 100644 --- a/SU2_CFD/src/output/COutput.cpp +++ b/SU2_CFD/src/output/COutput.cpp @@ -674,6 +674,7 @@ void COutput::WriteToFile(CConfig *config, CGeometry *geometry, unsigned short f bool COutput::SetResult_Files(CGeometry *geometry, CConfig *config, CSolver** solver_container, unsigned long iter, bool force_writing){ + if (curTimeIter != iter) curTimeIter = iter; bool writeFiles = WriteVolume_Output(config, iter, force_writing); /*--- Check if the data sorters are allocated, if not, allocate them. --- */ From bb873ffb8e5a43760a96b159a237a1c2e9ab55fe Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 17 Nov 2019 21:14:27 +0000 Subject: [PATCH 22/82] re-add output of files after evaluating sensitivities --- SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index c8087ab092c9..abcdbd647b91 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -403,6 +403,12 @@ void CDiscAdjMultizoneDriver::EvaluateSensitivities(unsigned long iOuterIter, bo AD::ClearAdjoints(); + for (iZone = 0; iZone < nZone; iZone++) { + + output_container[iZone]->SetResult_Files(geometry_container[iZone][INST_0][MESH_0], + config_container[iZone], + solver_container[iZone][INST_0][MESH_0], iOuterIter, StopCalc); + } } void CDiscAdjMultizoneDriver::SetRecording(unsigned short kind_recording, Kind_Tape tape_type, unsigned short record_zone) { From 2d566586f51137f5f21e480c0e0ef6b5d1180348 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 18 Nov 2019 11:44:33 +0000 Subject: [PATCH 23/82] modify restart iter from adjoint iter if needed --- SU2_CFD/src/solver_structure.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SU2_CFD/src/solver_structure.cpp b/SU2_CFD/src/solver_structure.cpp index ea792d31f08e..dcc2f26b27d0 100644 --- a/SU2_CFD/src/solver_structure.cpp +++ b/SU2_CFD/src/solver_structure.cpp @@ -4019,7 +4019,8 @@ void CSolver::Restart_OldGeometry(CGeometry *geometry, CConfig *config) { /*-------------------------------------------------------------------------------------------*/ /*--- Modify file name for an unsteady restart ---*/ - Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter())-1; + if (config->GetRestart()) Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter())-1; + else Unst_RestartIter = SU2_TYPE::Int(config->GetUnst_AdjointIter())-1; filename_n = config->GetFilename(filename, ".csv", Unst_RestartIter); /*--- Open the restart file, throw an error if this fails. ---*/ @@ -4092,7 +4093,8 @@ void CSolver::Restart_OldGeometry(CGeometry *geometry, CConfig *config) { string filename_n1; /*--- Modify file name for an unsteady restart ---*/ - Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter())-2; + if (config->GetRestart()) Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter())-2; + else Unst_RestartIter = SU2_TYPE::Int(config->GetUnst_AdjointIter())-2; filename_n1 = config->GetFilename(filename, ".csv", Unst_RestartIter); /*--- Open the restart file, throw an error if this fails. ---*/ From bf15fad3370fa6ce1a7aeb6a352873e13d610280 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 18 Nov 2019 15:10:26 +0000 Subject: [PATCH 24/82] Restart from old geometry in CMeshSolver for deforming mesh --- SU2_CFD/src/iteration_structure.cpp | 3 +++ SU2_CFD/src/solver_direct_mean.cpp | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 9f638a5c808f..7fb8c6c7478f 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -2284,6 +2284,9 @@ void CDiscAdjFluidIteration::LoadUnsteady_Solution(CGeometry ****geometry, } } } + if (config[val_iZone]->GetDeform_Mesh()) { + solver[val_iZone][val_iInst][MESH_0][MESH_SOL]->LoadRestart(geometry[val_iZone][val_iInst], solver[val_iZone][val_iInst], config[val_iZone], val_DirectIter, true); + } } diff --git a/SU2_CFD/src/solver_direct_mean.cpp b/SU2_CFD/src/solver_direct_mean.cpp index 92dd5d2388cf..e09782dd8ecf 100644 --- a/SU2_CFD/src/solver_direct_mean.cpp +++ b/SU2_CFD/src/solver_direct_mean.cpp @@ -12722,8 +12722,8 @@ void CEulerSolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig geometry[iMesh]->SetCoord(geometry[iMeshFine]); geometry[iMesh]->SetRestricted_GridVelocity(geometry[iMeshFine], config); geometry[iMesh]->SetMaxLength(config); - } } + } /*--- Update the geometry for flows on static FSI problems with moving meshes ---*/ @@ -12756,8 +12756,11 @@ void CEulerSolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig /*--- Update the old geometry (coordinates n and n-1) in dual time-stepping strategy. ---*/ - if (dual_time && config->GetGrid_Movement() && (config->GetKind_GridMovement() != RIGID_MOTION)) - Restart_OldGeometry(geometry[MESH_0], config); + if (dual_time && config->GetGrid_Movement() && (config->GetKind_GridMovement() != RIGID_MOTION)) { + if (!config->GetDeform_Mesh()) { + Restart_OldGeometry(geometry[MESH_0], config); + } + } delete [] Coord; From 2e58ba6e3d7f9c475ea2a3e1f8303e9f88a14170 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 18 Nov 2019 16:07:56 +0000 Subject: [PATCH 25/82] revert python changes --- SU2_PY/SU2/eval/functions.py | 12 +----- SU2_PY/SU2/eval/gradients.py | 24 ++--------- SU2_PY/SU2/io/tools.py | 83 ++++++++++++++++-------------------- SU2_PY/SU2/opt/project.py | 15 +++---- SU2_PY/SU2/run/adjoint.py | 15 ++----- SU2_PY/SU2/run/direct.py | 9 +--- SU2_PY/SU2/run/projection.py | 5 +-- 7 files changed, 56 insertions(+), 107 deletions(-) diff --git a/SU2_PY/SU2/eval/functions.py b/SU2_PY/SU2/eval/functions.py index c0f22b0d997a..88f2b8a20f64 100644 --- a/SU2_PY/SU2/eval/functions.py +++ b/SU2_PY/SU2/eval/functions.py @@ -44,7 +44,6 @@ from .. import io as su2io from .. import util as su2util from ..io import redirect_folder, redirect_output -from numpy import * # ---------------------------------------------------------------------- @@ -126,11 +125,7 @@ def function( func_name, config, state=None ): # If combine_objective is true, use the 'combo' output. func_out = state['FUNCTIONS']['COMBO'] else: - if config['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': - filename = os.getcwd() + '/DIRECT/of_refnode.dat' - func_out = loadtxt(filename) - else: - func_out = state['FUNCTIONS'][func_name] + func_out = state['FUNCTIONS'][func_name] if func_name_string in config['OPT_OBJECTIVE']: marker = config['OPT_OBJECTIVE'][func_name_string]['MARKER'] @@ -140,10 +135,7 @@ def function( func_name, config, state=None ): func_out = state['FUNCTIONS'][name] - #if config['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': - return func_out - #else: - # return copy.deepcopy(func_out) + return copy.deepcopy(func_out) #: def function() diff --git a/SU2_PY/SU2/eval/gradients.py b/SU2_PY/SU2/eval/gradients.py index 35c4916656c3..8f61701ec9b8 100644 --- a/SU2_PY/SU2/eval/gradients.py +++ b/SU2_PY/SU2/eval/gradients.py @@ -46,7 +46,7 @@ from .functions import function, update_mesh from ..io import redirect_folder, redirect_output from SU2.eval import functions -import numpy as np + # ---------------------------------------------------------------------- # Main Gradient Interface # ---------------------------------------------------------------------- @@ -141,11 +141,6 @@ def gradient( func_name, method, config, state=None ): # prepare output grads_out = state['GRADIENTS'][func_output] - if konfig['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': - filename = os.getcwd() + '/DIRECT/of_refnode.dat' - func_out = np.loadtxt(filename) - else: - func_out = state['FUNCTIONS'][func_name] return copy.deepcopy(grads_out) @@ -793,11 +788,7 @@ def findiff( config, state=None ): dvs_base = konfig['DV_VALUE_NEW'] # initialize gradients - func_keys = list(func_base.keys()) - if config['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE':#CVC: Debug: REFNODE - func_keys = ['REFNODE'] - func_keys = ['VARIABLE'] + func_keys + ['FINDIFF_STEP'] - #func_keys = ['VARIABLE'] + opt_names + ['FINDIFF_STEP'] + func_keys = ['VARIABLE'] + opt_names + ['FINDIFF_STEP'] grads = su2util.ordered_bunch.fromkeys(func_keys) for key in grads.keys(): grads[key] = [] @@ -817,7 +808,6 @@ def findiff( config, state=None ): # files: direct solution if 'DIRECT' in files: name = files['DIRECT'] - name = su2io.expand_zones(name, config) name = su2io.expand_time(name,config) link.extend(name) @@ -875,14 +865,7 @@ def findiff( config, state=None ): elif key == 'FINDIFF_STEP': grads[key].append(this_step) else: - if config['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE':#CVC: Debug: REFNODE - filename = os.path.dirname(os.getcwd()) + '/DIRECT/of_refnode.dat' - of_direct = np.loadtxt(filename) - filename = os.getcwd() + '/DIRECT/of_refnode.dat' - of_findiff = np.loadtxt(filename) - this_grad = ( of_findiff - of_direct ) / this_step - else: - this_grad = ( func_step[key] - func_base[key] ) / this_step + this_grad = ( func_step[key] - func_base[key] ) / this_step grads[key].append(this_grad) @@ -1113,7 +1096,6 @@ def directdiff( config, state=None ): # files: direct solution if 'DIRECT' in files: name = files['DIRECT'] - name = su2io.expand_zones(name, config) name = su2io.expand_time(name,config) link.extend(name) diff --git a/SU2_PY/SU2/io/tools.py b/SU2_PY/SU2/io/tools.py index 84a1fe4c79d6..e41ebf9b1466 100755 --- a/SU2_PY/SU2/io/tools.py +++ b/SU2_PY/SU2/io/tools.py @@ -127,12 +127,7 @@ def read_plot( filename ): # store to dictionary for i_Var in range(n_Vars): this_variable = Variables[i_Var] - # CVC: Temporary fix till full dataset is populated for FSI - # CVC: VM Stress and Time have header but no data in history file for FSI - try: - plot_data[this_variable] = plot_data[this_variable] + [ line_data[i_Var] ] - except (IndexError): - plot_data[this_variable] = '0.0' + plot_data[this_variable] = plot_data[this_variable] + [ line_data[i_Var] ] #: for each line @@ -467,7 +462,6 @@ def get_adjointSuffix(objective_function=None): "MASS_FLOW_IN" : "mfi" , "TOTAL_EFFICIENCY" : "teff" , "TOTAL_STATIC_EFFICIENCY" : "tseff" , - "REFERENCE_NODE" : "refnode" , "COMBO" : "combo"} # if none or false, return map @@ -523,29 +517,40 @@ def add_suffix(base_name,suffix): def get_dvMap(): """ get dictionary that maps design variable kind id number to name """ - dv_map = { 1 : "HICKS_HENNE" , - 2 : "SURFACE_BUMP" , - 4 : "NACA_4DIGITS" , - 5 : "TRANSLATION" , - 6 : "ROTATION" , - 7 : "FFD_CONTROL_POINT" , - 8 : "FFD_DIHEDRAL_ANGLE" , - 9 : "FFD_TWIST_ANGLE" , - 10 : "FFD_ROTATION" , - 11 : "FFD_CAMBER" , - 12 : "FFD_THICKNESS" , - 19 : "FFD_TWIST" , - 22 : "FFD_NACELLE" , - 23 : "FFD_GULL" , - 25 : "FFD_ROTATION" , - 15 : "FFD_CONTROL_POINT_2D" , - 16 : "FFD_CAMBER_2D" , - 17 : "FFD_THICKNESS_2D" , - 20 : "FFD_TWIST_2D" , - 50 : "CUSTOM" , - 51 : "CST" , - 101 : "ANGLE_OF_ATTACK" , - 102 : "FFD_ANGLE_OF_ATTACK" } + dv_map = { 0 : "NO_DEFORMATION" , + 1 : "TRANSLATION" , + 2 : "ROTATION" , + 3 : "SCALE" , + 10 : "FFD_SETTING" , + 11 : "FFD_CONTROL_POINT" , + 12 : "FFD_NACELLE" , + 13 : "FFD_GULL" , + 14 : "FFD_CAMBER" , + 15 : "FFD_TWIST" , + 16 : "FFD_THICKNESS" , + 18 : "FFD_ROTATION" , + 19 : "FFD_CONTROL_POINT_2D" , + 20 : "FFD_CAMBER_2D" , + 21 : "FFD_THICKNESS_2D" , + 22 : "FFD_TWIST_2D" , + 23 : "FFD_CONTROL_SURFACE" , + 24 : "FFD_ANGLE_OF_ATTACK" , + 30 : "HICKS_HENNE" , + 31 : "PARABOLIC" , + 32 : "NACA_4DIGITS" , + 33 : "AIRFOIL" , + 34 : "CST" , + 35 : "SURFACE_BUMP" , + 36 : "SURFACE_FILE" , + 40 : "DV_EFIELD" , + 41 : "DV_YOUNG" , + 42 : "DV_POISSON" , + 43 : "DV_RHO" , + 44 : "DV_RHO_DL" , + 50 : "TRANSLATE_GRID" , + 51 : "ROTATE_GRID" , + 52 : "SCALE_GRID" , + 101 : "ANGLE_OF_ATTACK" } return dv_map @@ -624,9 +629,6 @@ def get_gradFileFormat(grad_type,plot_format,kindID,special_cases=[]): if key == "INV_DESIGN_HEATFLUX" : header.append(r',"Grad_HeatFlux_Diff"') write_format.append(", %.10f") - if key == "REF_NODE" : - header.append(r',"Grad_RefNode"') - write_format.append(", %.10f") # otherwise... else: raise Exception('Unrecognized Gradient Type') @@ -748,9 +750,6 @@ def get_optFileFormat(plot_format,special_cases=None, nZones = 1): if key == "INV_DESIGN_HEATFLUX" : header_list.extend(["HeatFlux_Diff"]) write_format.append(r', %.10f') - if key == "REF_NODE" : - header_list.extend(["REF_NODE"]) - write_format.append(r', %.10f') # finish formats header_format = (header_format) + ('"') + ('","').join(header_list) + ('"') + (' \n') @@ -803,8 +802,7 @@ def get_specialCases(config): 'EQUIV_AREA' , '1D_OUTPUT' , 'INV_DESIGN_CP' , - 'INV_DESIGN_HEATFLUX' , - 'REF_NODE']#CVC: Debug: + 'INV_DESIGN_HEATFLUX' ] special_cases = [] for key in all_special_cases: @@ -828,10 +826,6 @@ def get_specialCases(config): # Special case for rotating frame if 'GRID_MOVEMENT_KIND' in config and config['GRID_MOVEMENT_KIND'] == 'ROTATING_FRAME': special_cases.append('ROTATING_FRAME') - - #CVC: Debug: - if config['OBJECTIVE_FUNCTION'] == 'RERFERENCE_NODE': - special_cases.append('REF_NODE') return special_cases @@ -1062,10 +1056,7 @@ def restart2solution(config,state={}): solution += '.dat' # add suffix func_name = config.OBJECTIVE_FUNCTION - if config['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': - suffix = "refnode" - else: - suffix = get_adjointSuffix(func_name) + suffix = get_adjointSuffix(func_name) restart = add_suffix(restart,suffix) solution = add_suffix(solution,suffix) # expand zones diff --git a/SU2_PY/SU2/opt/project.py b/SU2_PY/SU2/opt/project.py index 8ddcd869adfd..4a3963e5d8e6 100644 --- a/SU2_PY/SU2/opt/project.py +++ b/SU2_PY/SU2/opt/project.py @@ -461,14 +461,13 @@ def compile_results(self,default=np.nan): results.GRADIENTS[key].append(new_grad) for TYPE in results.HISTORY.keys(): for key in results.HISTORY[TYPE].keys(): - # if key in results.FUNCTIONS.keys(): - # new_func = results.FUNCTIONS[key][-1] - # elif ( TYPE in design.state.HISTORY.keys() and - # key in design.state.HISTORY[TYPE].keys() ): - # new_func = design.state.HISTORY[TYPE][key][-1] - # else: - # new_func = default - new_func = default + if key in results.FUNCTIONS.keys(): + new_func = results.FUNCTIONS[key][-1] + elif ( TYPE in design.state.HISTORY.keys() and + key in design.state.HISTORY[TYPE].keys() ): + new_func = design.state.HISTORY[TYPE][key][-1] + else: + new_func = default results.HISTORY[TYPE][key].append(new_func) #: for each design diff --git a/SU2_PY/SU2/run/adjoint.py b/SU2_PY/SU2/run/adjoint.py index c8d17767aa20..606094cda949 100644 --- a/SU2_PY/SU2/run/adjoint.py +++ b/SU2_PY/SU2/run/adjoint.py @@ -39,7 +39,7 @@ # Imports # ---------------------------------------------------------------------- -import os, copy +import copy from .. import io as su2io from .merge import merge as su2merge @@ -84,7 +84,7 @@ def adjoint( config ): konfig['MATH_PROBLEM'] = 'CONTINUOUS_ADJOINT' konfig['CONV_FILENAME'] = konfig['CONV_FILENAME'] + '_adjoint' - konfig['RAMP_LOADING'] = 'NO' #CVC: Temp to allow ramp only in direct sim from single config python scripts + # Run Solution SU2_CFD(konfig) @@ -95,11 +95,7 @@ def adjoint( config ): # filenames plot_format = konfig.get('TABULAR_FORMAT', 'CSV') plot_extension = su2io.get_extension(plot_format) - # CVC: Adjustment needed as FSI history filenames are different - if konfig['SOLVER'] == 'FLUID_STRUCTURE_INTERACTION': - history_filename = 'history_adjoint_FSI' + plot_extension - else: - history_filename = konfig['CONV_FILENAME'] + plot_extension + history_filename = konfig['CONV_FILENAME'] + plot_extension special_cases = su2io.get_specialCases(konfig) # get history @@ -114,10 +110,7 @@ def adjoint( config ): if "," in objective: objective="COMBO" adj_title = 'ADJOINT_' + objective - if konfig['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': - suffix = "refnode" - else: - suffix = su2io.get_adjointSuffix(objective) + suffix = su2io.get_adjointSuffix(objective) restart_name = konfig['RESTART_FILENAME'] restart_name = su2io.add_suffix(restart_name,suffix) diff --git a/SU2_PY/SU2/run/direct.py b/SU2_PY/SU2/run/direct.py index c86e72ab5a68..fa54184dbb85 100644 --- a/SU2_PY/SU2/run/direct.py +++ b/SU2_PY/SU2/run/direct.py @@ -39,7 +39,7 @@ # Imports # ---------------------------------------------------------------------- -import shutil, copy +import copy from .. import io as su2io from .merge import merge as su2merge @@ -98,12 +98,7 @@ def direct ( config ): # filenames plot_format = konfig.get('TABULAR_FORMAT', 'CSV') plot_extension = su2io.get_extension(plot_format) - # CVC: Adjustment needed as FSI history filenames are different - if konfig['SOLVER'] == 'FLUID_STRUCTURE_INTERACTION': - shutil.copy(konfig['CONV_FILENAME_FSI'] + '.vtk',konfig['CONV_FILENAME_FSI'] + '.csv') - history_filename = konfig['CONV_FILENAME_FSI'] + '.csv' - else: - history_filename = konfig['CONV_FILENAME'] + plot_extension + history_filename = konfig['CONV_FILENAME'] + plot_extension special_cases = su2io.get_specialCases(konfig) # averaging final iterations diff --git a/SU2_PY/SU2/run/projection.py b/SU2_PY/SU2/run/projection.py index c9b68dd31f9a..5474caee13b1 100644 --- a/SU2_PY/SU2/run/projection.py +++ b/SU2_PY/SU2/run/projection.py @@ -96,10 +96,7 @@ def projection( config, state={}, step = 1e-3 ): grad_filename = konfig['GRAD_OBJFUNC_FILENAME'] output_format = konfig.get('TABULAR_FORMAT', 'CSV') plot_extension = su2io.get_extension(output_format) - if konfig['OBJECTIVE_FUNCTION'] == 'REFERENCE_NODE': - adj_suffix = "refnode" - else: - adj_suffix = su2io.get_adjointSuffix(objective) + adj_suffix = su2io.get_adjointSuffix(objective) grad_plotname = os.path.splitext(grad_filename)[0] + '_' + adj_suffix + plot_extension # Run Projection From c834fa444902c38c841da916d7d3b78502797f7b Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 18 Nov 2019 17:19:24 +0000 Subject: [PATCH 26/82] clean up --- Common/src/config_structure.cpp | 6 --- SU2_CFD/include/iteration_structure.hpp | 11 +---- SU2_CFD/src/SU2_CFD.cpp | 5 --- .../src/drivers/CDiscAdjMultizoneDriver.cpp | 11 ++--- .../src/drivers/CDiscAdjSinglezoneDriver.cpp | 4 +- SU2_CFD/src/drivers/CDriver.cpp | 43 ++++++------------- SU2_CFD/src/iteration_structure.cpp | 8 +--- .../numerics_direct_elasticity_nonlinear.cpp | 1 - SU2_CFD/src/output/CElasticityOutput.cpp | 2 +- SU2_CFD/src/output/COutput.cpp | 2 +- .../src/output/output_structure_legacy.cpp | 4 +- SU2_CFD/src/solver_adjoint_elasticity.cpp | 1 + SU2_CFD/src/solver_direct_elasticity.cpp | 5 +-- 13 files changed, 31 insertions(+), 72 deletions(-) diff --git a/Common/src/config_structure.cpp b/Common/src/config_structure.cpp index db5c426e3246..ebf99d0b5e28 100644 --- a/Common/src/config_structure.cpp +++ b/Common/src/config_structure.cpp @@ -4491,12 +4491,6 @@ void CConfig::SetPostprocessing(unsigned short val_software, unsigned short val_ Restart_Flow = false; - /*if (GetKind_GridMovement() != RIGID_MOTION && - GetKind_GridMovement() != NO_MOVEMENT) { - SU2_MPI::Error(string("Dynamic mesh movement currently only supported for the discrete adjoint solver for\n") + - string("GRID_MOVEMENT = RIGID_MOTION."), CURRENT_FUNCTION); - }*/ - if (Unst_AdjointIter- long(nTimeIter) < 0){ SU2_MPI::Error(string("Invalid iteration number requested for unsteady adjoint.\n" ) + string("Make sure EXT_ITER is larger or equal than UNST_ADJOINT_ITER."), diff --git a/SU2_CFD/include/iteration_structure.hpp b/SU2_CFD/include/iteration_structure.hpp index 1be41ed64146..967aac0a1301 100644 --- a/SU2_CFD/include/iteration_structure.hpp +++ b/SU2_CFD/include/iteration_structure.hpp @@ -1548,19 +1548,12 @@ class CDiscAdjFEAIteration : public CIteration { * \param[in] solver - Container vector with all the solutions. * \param[in] geometry - Geometrical definition of the problem. * \param[in] config - Definition of the particular problem. - * \param[in] output - Pointer to the COutput class. * \param[in] iZone - Index of the zone. - * \param[in] iInst - Index of the instance layer. + * \param[in] iInst - Index of the zone. */ void RegisterOutput(CSolver *****solver, CGeometry ****geometry, CConfig** config, unsigned short iZone, unsigned short iInst); using CIteration::RegisterOutput; - - /*void RegisterOutput(CSolver *****solver, - CGeometry ****geometry, - CConfig** config, - COutput* output, - unsigned short iZone, unsigned short iInst);*/ - + /*! * \brief Initializes the adjoints of the output variables of the FEM iteration. * \param[in] solver - Container vector with all the solutions. diff --git a/SU2_CFD/src/SU2_CFD.cpp b/SU2_CFD/src/SU2_CFD.cpp index cd0438f95e16..54dd597197e8 100644 --- a/SU2_CFD/src/SU2_CFD.cpp +++ b/SU2_CFD/src/SU2_CFD.cpp @@ -151,12 +151,7 @@ int main(int argc, char *argv[]) { /*--- If the problem is a discrete adjoint FSI problem ---*/ if (disc_adj_fsi) { - //if (stat_fsi) { driver = new CDiscAdjFSIDriver(config_file_name, nZone, MPICommunicator); - /*} - else { - SU2_MPI::Error("WARNING: There is no discrete adjoint implementation for dynamic FSI. ", CURRENT_FUNCTION); - }*/ } } else { diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index abcdbd647b91..3b7d6d2eec0f 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -119,9 +119,8 @@ void CDiscAdjMultizoneDriver::StartSolver() { cout << "\nSimulation Run using the Discrete Adjoint Multizone Driver" << endl; - // if (driver_config->GetTime_Domain()) - // SU2_MPI::Error("The discrete adjoint multizone driver is not ready for unsteady computations yet.", - // CURRENT_FUNCTION); + if (driver_config->GetTime_Domain()) + cout << "The simulation will run for " << driver_config->GetnTime_Iter() << " time steps." << endl; } for (iZone = 0; iZone < nZone; iZone++){ @@ -318,8 +317,10 @@ void CDiscAdjMultizoneDriver::Run() { bool checkSensitivity = StopCalc || ((iOuterIter % wrt_sol_freq == 0) && (iOuterIter != 0)); - if (checkSensitivity) - EvaluateSensitivities(iOuterIter, StopCalc); + if (checkSensitivity) { + if (!time_domain) EvaluateSensitivities(iOuterIter, StopCalc); + else EvaluateSensitivities(TimeIter, StopCalc); + } } /*--- Output the solution in files for each time iteration. ---*/ diff --git a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp index c0e1deff8532..9a747edc4ff3 100644 --- a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp @@ -139,7 +139,7 @@ void CDiscAdjSinglezoneDriver::Preprocess(unsigned long TimeIter) { /*--- For the adjoint iteration we need the derivatives of the iteration function with *--- respect to the conservative variables. Since these derivatives do not change in the steady state case *--- we only have to record if the current recording is different from the main variables. ---*/ - + if ((RecordingState != MainVariables) || (config->GetTime_Domain())){ MainRecording(); @@ -393,7 +393,7 @@ void CDiscAdjSinglezoneDriver::SetObjFunction(){ } break; } - + if (rank == MASTER_NODE) { AD::RegisterOutput(ObjFunc); } diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index 60109982a755..e5b98f23bd8b 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -4128,6 +4128,7 @@ void CFluidDriver::DynamicMeshUpdate(unsigned long TimeIter) { iteration_container[iZone][INST_0]->SetGrid_Movement(geometry_container[iZone][INST_0], surface_movement[iZone], grid_movement[iZone][INST_0], solver_container[iZone][INST_0], config_container[iZone], 0, TimeIter ); } } + } bool CFluidDriver::Monitor(unsigned long ExtIter) { @@ -5113,27 +5114,27 @@ CDiscAdjFSIDriver::CDiscAdjFSIDriver(char* confFile, ofstream myfile_res; myfile_res.open ("history_adjoint_FSI.csv"); - myfile_res << "BGS_Iter"; + myfile_res << "BGS_Iter\t"; for (iVar = 0; iVar < nVar_Flow; iVar++){ - myfile_res << ", " << "ResFlow[" << iVar << "]"; + myfile_res << "ResFlow[" << iVar << "]\t"; } for (iVar = 0; iVar < nVar_Struct; iVar++){ - myfile_res << ", " << "ResFEA[" << iVar << "]"; + myfile_res << "ResFEA[" << iVar << "]\t"; } bool de_effects = config_container[ZONE_0]->GetDE_Effects(); for (iVar = 0; iVar < config_container[ZONE_0]->GetnElasticityMod(); iVar++) - myfile_res << ", " << "Sens_E_" << iVar; + myfile_res << "Sens_E_" << iVar << "\t"; for (iVar = 0; iVar < config_container[ZONE_0]->GetnPoissonRatio(); iVar++) - myfile_res << ", " << "Sens_Nu_" << iVar; + myfile_res << "Sens_Nu_" << iVar << "\t"; if (de_effects){ for (iVar = 0; iVar < config_container[ZONE_0]->GetnElectric_Field(); iVar++) - myfile_res << ", " << "Sens_EField_" << iVar; + myfile_res << "Sens_EField_" << iVar << "\t"; } myfile_res << endl; @@ -5185,8 +5186,6 @@ CDiscAdjFSIDriver::CDiscAdjFSIDriver(char* confFile, output_legacy = new COutputLegacy(config_container[ZONE_0]); /*--- TODO: This is a workaround until the TestCases.py script incorporates new classes for nested loops. ---*/ -// if (config_container[ZONE_0]->GetUnsteady_Simulation() == NONE) config_container[ZONE_0]->SetnExtIter(1); -// if (config_container[ZONE_1]->GetDynamic_Analysis() != DYNAMIC) config_container[ZONE_1]->SetnExtIter(1); // config_container[ZONE_0]->SetnExtIter(1); // config_container[ZONE_1]->SetnExtIter(1); ConvHist_file = NULL; @@ -5389,14 +5388,6 @@ void CDiscAdjFSIDriver::Preprocess(unsigned short ZONE_FLOW, iteration_container[ZONE_FLOW][INST_0]->LoadUnsteady_Solution(geometry_container, solver_container,config_container, ZONE_FLOW, INST_0, Direct_Iter_Flow - 2); - //CVC: Debug - /*--- Load solution timestep n-1 | n-2 for DualTimestepping 1st | 2nd order ---*/ - //if (dual_time_1st){ - // iteration_container[ZONE_FLOW][INST_0]->LoadUnsteady_Solution(geometry_container, solver_container,config_container, ZONE_FLOW, INST_0, Direct_Iter_Flow - 1); - //} else { - // iteration_container[ZONE_FLOW][INST_0]->LoadUnsteady_Solution(geometry_container, solver_container,config_container, ZONE_FLOW, INST_0, Direct_Iter_Flow - 2); - //} - /*--- Temporarily store the loaded solution in the Solution_Old array ---*/ for (iMesh=0; iMesh<=config_container[ZONE_FLOW]->GetnMGLevels();iMesh++) { @@ -5420,9 +5411,6 @@ void CDiscAdjFSIDriver::Preprocess(unsigned short ZONE_FLOW, /*--- Set Solution at timestep n-1 to the previously loaded solution ---*/ for (iMesh=0; iMesh<=config_container[ZONE_FLOW]->GetnMGLevels();iMesh++) { for(iPoint=0; iPointGetnPoint();iPoint++) { -// solver_container[ZONE_FLOW][INST_0][iMesh][FLOW_SOL]->node[iPoint]->Set_Solution_time_n(solver_container[ZONE_FLOW][INST_0][iMesh][FLOW_SOL]->node[iPoint]->GetSolution_Old()); -// if (turbulent) { -// solver_container[ZONE_FLOW][INST_0][iMesh][TURB_SOL]->node[iPoint]->Set_Solution_time_n(solver_container[ZONE_FLOW][INST_0][iMesh][TURB_SOL]->node[iPoint]->GetSolution_Old()); solver_container[ZONE_FLOW][INST_0][iMesh][FLOW_SOL]->GetNodes()->Set_Solution_time_n(iPoint, solver_container[ZONE_FLOW][INST_0][iMesh][FLOW_SOL]->GetNodes()->GetSolution_time_n1(iPoint)); if (turbulent) { solver_container[ZONE_FLOW][INST_0][iMesh][TURB_SOL]->GetNodes()->Set_Solution_time_n(iPoint, solver_container[ZONE_FLOW][INST_0][iMesh][TURB_SOL]->GetNodes()->GetSolution_time_n1(iPoint)); @@ -5866,11 +5854,6 @@ void CDiscAdjFSIDriver::SetRecording(unsigned short ZONE_FLOW, string kind_DirectIteration = " "; string kind_AdjointIteration = " "; - /*if (unsteady || dynamic){ - SU2_MPI::Error("DYNAMIC ADJOINT SOLVER NOT IMPLEMENTED FOR FSI APPLICATIONS", CURRENT_FUNCTION); - }*/ - - if (rank == MASTER_NODE){ cout << endl; switch (kind_recording){ @@ -6480,25 +6463,25 @@ bool CDiscAdjFSIDriver::BGSConvergence(unsigned long IntIter, myfile_res.open ("history_adjoint_FSI.csv", ios::app); - myfile_res << IntIter; + myfile_res << IntIter << "\t"; myfile_res.precision(15); for (iVar = 0; iVar < nVar_Flow; iVar++){ - myfile_res << fixed << ", " << residual_flow[iVar]; + myfile_res << fixed << residual_flow[iVar] << "\t"; } for (iVar = 0; iVar < nVar_Struct; iVar++){ - myfile_res << fixed << ", " << residual_struct[iVar]; + myfile_res << fixed << residual_struct[iVar] << "\t"; } for (iVar = 0; iVar < config_container[ZONE_STRUCT]->GetnElasticityMod(); iVar++) - myfile_res << scientific << ", " << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_E(iVar); + myfile_res << scientific << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_E(iVar) << "\t"; for (iVar = 0; iVar < config_container[ZONE_STRUCT]->GetnPoissonRatio(); iVar++) - myfile_res << scientific << ", " << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_Nu(iVar); + myfile_res << scientific << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_Nu(iVar) << "\t"; if (de_effects){ for (iVar = 0; iVar < config_container[ZONE_STRUCT]->GetnElectric_Field(); iVar++) - myfile_res << scientific << ", " << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_EField(0); + myfile_res << scientific << solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetGlobal_Sens_EField(0) << "\t"; } myfile_res << endl; diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 3fc93524e4f2..838cde02ee2d 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -253,9 +253,7 @@ void CIteration::SetGrid_Movement(CGeometry **geometry, nIterMesh = grid_movement->Get_nIterMesh(); stat_mesh = (nIterMesh == 0); - //CVC: Debug: //if (!adjoint && !stat_mesh) { - //CVC: Debug: Are the grid velocities from the direct solution stored and handled correctly? if (!discrete_adjoint && !stat_mesh) { if (rank == MASTER_NODE && Screen_Output) cout << "Computing grid velocities by finite differencing." << endl; @@ -2429,7 +2427,7 @@ void CDiscAdjFluidIteration::SetRecording(CSolver *****solver, unsigned short val_iZone, unsigned short val_iInst, unsigned short kind_recording) { - + unsigned short iMesh; /*--- Prepare for recording by resetting the solution to the initial converged solution ---*/ @@ -2857,7 +2855,6 @@ void CDiscAdjFEAIteration::SetRecording(COutput *output, /*--- Register structural variables and objective function as output ---*/ RegisterOutput(solver, geometry, config, val_iZone, val_iInst); - //RegisterOutput(solver, geometry, config, output, val_iZone, val_iInst); /*--- Stop the recording ---*/ @@ -2883,7 +2880,7 @@ void CDiscAdjFEAIteration::SetRecording(CSolver *****solver, /*--- Set correct time iteration for recording if dynamic simulation ---*/ - if (config[val_iZone]->GetDynamic_Analysis() == DYNAMIC) { + if (config[val_iZone]->GetTime_Domain()) { unsigned long TimeIter = config[val_iZone]->GetTimeIter(); config[val_iZone]->SetTimeIter(TimeIter); } @@ -3014,7 +3011,6 @@ void CDiscAdjFEAIteration::SetDependencies(CSolver *****solver, CGeometry ****ge } void CDiscAdjFEAIteration::RegisterOutput(CSolver *****solver, CGeometry ****geometry, CConfig **config, unsigned short iZone, unsigned short iInst){ -//void CDiscAdjFEAIteration::RegisterOutput(CSolver *****solver, CGeometry ****geometry, CConfig **config, COutput* output, unsigned short iZone, unsigned short iInst){ /*--- Register conservative variables as output of the iteration ---*/ diff --git a/SU2_CFD/src/numerics_direct_elasticity_nonlinear.cpp b/SU2_CFD/src/numerics_direct_elasticity_nonlinear.cpp index 573da8c157d3..b4efb8924738 100644 --- a/SU2_CFD/src/numerics_direct_elasticity_nonlinear.cpp +++ b/SU2_CFD/src/numerics_direct_elasticity_nonlinear.cpp @@ -345,7 +345,6 @@ void CFEANonlinearElasticity::Compute_Tangent_Matrix(CElement *element, CConfig GradNi_Ref_Mat[iNode][iDim] = element->GetGradNi_X(iNode,iGauss,iDim); GradNi_Curr_Mat[iNode][iDim] = element->GetGradNi_x(iNode,iGauss,iDim); currentCoord[iNode][iDim] = element->GetCurr_Coord(iNode, iDim); - //cout << "CVC: Debug: currentCoord[" << iNode << "][" << iDim << "] = " << currentCoord[iNode][iDim] << endl; } /*--- Compute the deformation gradient ---*/ diff --git a/SU2_CFD/src/output/CElasticityOutput.cpp b/SU2_CFD/src/output/CElasticityOutput.cpp index 6c61a91495f2..01c3d3cade19 100644 --- a/SU2_CFD/src/output/CElasticityOutput.cpp +++ b/SU2_CFD/src/output/CElasticityOutput.cpp @@ -217,7 +217,7 @@ void CElasticityOutput::SetVolumeOutputFields(CConfig *config){ AddVolumeOutput("DISPLACEMENT-X", "Displacement_x", "SOLUTION", "x-component of the displacement vector"); AddVolumeOutput("DISPLACEMENT-Y", "Displacement_y", "SOLUTION", "y-component of the displacement vector"); if (nDim == 3) AddVolumeOutput("DISPLACEMENT-Z", "Displacement_z", "SOLUTION", "z-component of the displacement vector"); - + if(dynamic){ AddVolumeOutput("VELOCITY-X", "Velocity_x", "VELOCITY", "x-component of the velocity vector"); AddVolumeOutput("VELOCITY-Y", "Velocity_y", "VELOCITY", "y-component of the velocity vector"); diff --git a/SU2_CFD/src/output/COutput.cpp b/SU2_CFD/src/output/COutput.cpp index 25085dba56eb..e37ff9ceb4cd 100644 --- a/SU2_CFD/src/output/COutput.cpp +++ b/SU2_CFD/src/output/COutput.cpp @@ -673,7 +673,7 @@ void COutput::WriteToFile(CConfig *config, CGeometry *geometry, unsigned short f bool COutput::SetResult_Files(CGeometry *geometry, CConfig *config, CSolver** solver_container, unsigned long iter, bool force_writing){ - + if (curTimeIter != iter) curTimeIter = iter; //CVC: Temp to fix incorrect time iteration number with legacy driver bool writeFiles = WriteVolume_Output(config, iter, force_writing); diff --git a/SU2_CFD/src/output/output_structure_legacy.cpp b/SU2_CFD/src/output/output_structure_legacy.cpp index c71f99a757ce..bd12934f271d 100644 --- a/SU2_CFD/src/output/output_structure_legacy.cpp +++ b/SU2_CFD/src/output/output_structure_legacy.cpp @@ -11364,7 +11364,7 @@ void COutputLegacy::SpecialOutput_FSI(ofstream *FSIHist_file, CGeometry ****geom case EULER : case NAVIER_STOKES: case RANS : case INC_EULER : case INC_NAVIER_STOKES: case INC_RANS : FSIHist_file[0] << flow_resid; - //if (turbulent) FSIHist_file[0] << turb_resid; + if (turbulent) FSIHist_file[0] << turb_resid; break; case DISC_ADJ_EULER: case DISC_ADJ_NAVIER_STOKES: case DISC_ADJ_RANS: @@ -11394,7 +11394,7 @@ void COutputLegacy::SpecialOutput_FSI(ofstream *FSIHist_file, CGeometry ****geom case EULER : case NAVIER_STOKES: case RANS : case INC_EULER : case INC_NAVIER_STOKES: case INC_RANS : FSIHist_file[0] << flow_coeff; - //if (turbulent) FSIHist_file[0] << turb_resid; + if (turbulent) FSIHist_file[0] << turb_resid; if (direct_diff != NO_DERIVATIVE) { FSIHist_file[0] << d_flow_coeff; } diff --git a/SU2_CFD/src/solver_adjoint_elasticity.cpp b/SU2_CFD/src/solver_adjoint_elasticity.cpp index 31cd8e98fbc0..f6ac20cacc32 100644 --- a/SU2_CFD/src/solver_adjoint_elasticity.cpp +++ b/SU2_CFD/src/solver_adjoint_elasticity.cpp @@ -980,6 +980,7 @@ void CDiscAdjFEASolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CC Total_Sens_Rho[iVar] += Global_Sens_Rho[iVar]; Total_Sens_Rho_DL[iVar] += Global_Sens_Rho_DL[iVar]; } + if (de_effects){ for (iVar = 0; iVar < nEField; iVar++) Total_Sens_EField[iVar]+= Global_Sens_EField[iVar]; diff --git a/SU2_CFD/src/solver_direct_elasticity.cpp b/SU2_CFD/src/solver_direct_elasticity.cpp index 45cbad6af468..2a704243ffe1 100644 --- a/SU2_CFD/src/solver_direct_elasticity.cpp +++ b/SU2_CFD/src/solver_direct_elasticity.cpp @@ -1154,11 +1154,10 @@ void CFEASolver::Compute_StiffMatrix(CGeometry *geometry, CNumerics **numerics, for (iNode = 0; iNode < nNodes; iNode++) { indexNode[iNode] = geometry->elem[iElem]->GetNode(iNode); - // CVC: Debug: reference nodes and displaced nodes + for (iDim = 0; iDim < nDim; iDim++) { val_Coord = Get_ValCoord(geometry, indexNode[iNode], iDim); val_Sol = nodes->GetSolution(indexNode[iNode],iDim) + val_Coord; - //cout << "CVC: Debug: iNode = " << iNode << ", iDim = " << iDim << ", val_Sol = " << val_Sol << endl; element_container[FEA_TERM][EL_KIND]->SetRef_Coord(val_Coord, iNode, iDim); element_container[FEA_TERM][EL_KIND]->SetCurr_Coord(val_Sol, iNode, iDim); } @@ -1253,10 +1252,8 @@ void CFEASolver::Compute_StiffMatrix_NodalStressRes(CGeometry *geometry, CNumeri for (iDim = 0; iDim < nDim; iDim++) { val_Coord = Get_ValCoord(geometry, indexNode[iNode], iDim); val_Sol = nodes->GetSolution(indexNode[iNode],iDim) + val_Coord; - //if (iDim == 0) cout << "CVC: Debug: coord = " << val_Coord << ", disp = " << node[indexNode[iNode]]->GetSolution(iDim) << endl; /*--- Set current coordinate ---*/ - //if (iDim == 0) cout << "CVC: Debug: iNode = " << iNode << ", iDim = " << iDim << ", val_Sol Curr_Coord = " << val_Sol << endl; element_container[FEA_TERM][EL_KIND]->SetCurr_Coord(val_Sol, iNode, iDim); if (de_effects) element_container[DE_TERM][EL_KIND]->SetCurr_Coord(val_Sol, iNode, iDim); From 794f0f3f67d44fe5d97f20fb9f2e3c6420a4f150 Mon Sep 17 00:00:00 2001 From: cvencro Date: Tue, 19 Nov 2019 10:32:15 +0000 Subject: [PATCH 27/82] move time loop to outside of run --- SU2_CFD/src/SU2_CFD.cpp | 2 +- .../src/drivers/CDiscAdjMultizoneDriver.cpp | 264 +++++++++--------- 2 files changed, 130 insertions(+), 136 deletions(-) diff --git a/SU2_CFD/src/SU2_CFD.cpp b/SU2_CFD/src/SU2_CFD.cpp index 54dd597197e8..dac3e46bb7f9 100644 --- a/SU2_CFD/src/SU2_CFD.cpp +++ b/SU2_CFD/src/SU2_CFD.cpp @@ -123,7 +123,7 @@ int main(int argc, char *argv[]) { driver = new CSinglezoneDriver(config_file_name, nZone, MPICommunicator); } - else if (config->GetMultizone_Problem() && !turbo){// && !fsi) { + else if (config->GetMultizone_Problem() && !turbo && !fsi) { /*--- Multizone Drivers. ---*/ diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index 3b7d6d2eec0f..3e1620f06153 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -112,6 +112,8 @@ CDiscAdjMultizoneDriver::~CDiscAdjMultizoneDriver(){ void CDiscAdjMultizoneDriver::StartSolver() { + bool time_domain = driver_config->GetTime_Domain(); + /*--- Main external loop of the solver. Runs for the number of time steps required. ---*/ if (rank == MASTER_NODE) { @@ -119,26 +121,37 @@ void CDiscAdjMultizoneDriver::StartSolver() { cout << "\nSimulation Run using the Discrete Adjoint Multizone Driver" << endl; - if (driver_config->GetTime_Domain()) + if (time_domain) cout << "The simulation will run for " << driver_config->GetnTime_Iter() << " time steps." << endl; } - for (iZone = 0; iZone < nZone; iZone++){ + for (iZone = 0; iZone < nZone; iZone++) { - /*--- Set the value of the external iteration to TimeIter. -------------------------------------*/ - /*--- TODO: This should be generalised for an homogeneous criteria throughout the code. --------*/ - config_container[iZone]->SetTimeIter(0); + /*--- Set current time iteration ---*/ + config_container[iZone]->SetTimeIter(TimeIter); + if (time_domain) + config_container[iZone]->SetPhysicalTime(static_cast(TimeIter)*config_container[iZone]->GetDelta_UnstTimeND()); + else + config_container[iZone]->SetPhysicalTime(0.0); } - /*--- Size and initialize the matrix of cross-terms. ---*/ + while ( TimeIter < driver_config->GetnTime_Iter()) { + + /*--- Size and initialize the matrix of cross-terms. ---*/ + + InitializeCrossTerms(); - InitializeCrossTerms(); + /*--- We directly start the discrete adjoint computation. ---*/ - /*--- We directly start the (steady-state) discrete adjoint computation. ---*/ + Run(); - Run(); + /*--- Output the solution in files for each time iteration. ---*/ + + Output(TimeIter); + TimeIter++; + } } void CDiscAdjMultizoneDriver::Run() { @@ -147,187 +160,166 @@ void CDiscAdjMultizoneDriver::Run() { unsigned long nOuterIter = driver_config->GetnOuter_Iter(); bool time_domain = driver_config->GetTime_Domain(); - while ( TimeIter < driver_config->GetnTime_Iter()) { + for (iZone = 0; iZone < nZone; iZone++) { - for (iZone = 0; iZone < nZone; iZone++) { + if (!time_domain) + wrt_sol_freq = min(wrt_sol_freq, config_container[iZone]->GetVolume_Wrt_Freq()); - /*--- Set current time iteration ---*/ - config_container[iZone]->SetTimeIter(TimeIter); + iteration_container[iZone][INST_0]->Preprocess(output_container[iZone], integration_container, geometry_container, + solver_container, numerics_container, config_container, surface_movement, + grid_movement, FFDBox, iZone, INST_0); - if (config_container[iZone]->GetTime_Domain()) - config_container[iZone]->SetPhysicalTime(static_cast(TimeIter)*config_container[iZone]->GetDelta_UnstTimeND()); - else - config_container[iZone]->SetPhysicalTime(0.0); - } - for (iZone = 0; iZone < nZone; iZone++) { + /*--- Set BGS_Solution_k to Solution. ---*/ - if (!time_domain) - wrt_sol_freq = min(wrt_sol_freq, config_container[iZone]->GetVolume_Wrt_Freq()); + Set_BGSSolution(iZone); + } - iteration_container[iZone][INST_0]->Preprocess(output_container[iZone], integration_container, geometry_container, - solver_container, numerics_container, config_container, surface_movement, - grid_movement, FFDBox, iZone, INST_0); + /*--- Evaluate the objective function gradient w.r.t. the solutions of all zones. ---*/ - /*--- Set BGS_Solution_k to Solution. ---*/ + SetRecording(NONE, Kind_Tape::FULL_TAPE, ZONE_0); + SetRecording(FLOW_CONS_VARS, Kind_Tape::OBJECTIVE_FUNCTION_TAPE, ZONE_0); + RecordingState = NONE; - Set_BGSSolution(iZone); - } + AD::ClearAdjoints(); + SetAdj_ObjFunction(); + AD::ComputeAdjoint(OBJECTIVE_FUNCTION, START); - /*--- Evaluate the objective function gradient w.r.t. the solutions of all zones. ---*/ + /*--- Initialize External with the objective function gradient. ---*/ - SetRecording(NONE, Kind_Tape::FULL_TAPE, ZONE_0); - SetRecording(FLOW_CONS_VARS, Kind_Tape::OBJECTIVE_FUNCTION_TAPE, ZONE_0); - RecordingState = NONE; + for (iZone = 0; iZone < nZone; iZone++) { - AD::ClearAdjoints(); - SetAdj_ObjFunction(); - AD::ComputeAdjoint(OBJECTIVE_FUNCTION, START); + iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, + solver_container, numerics_container, config_container, + surface_movement, grid_movement, FFDBox, iZone, INST_0); + Add_Solution_To_External(iZone); + } - /*--- Initialize External with the objective function gradient. ---*/ + /*--- Loop over the number of outer iterations. ---*/ - for (iZone = 0; iZone < nZone; iZone++) { + for (unsigned long iOuterIter = 0, StopCalc = false; !StopCalc; iOuterIter++) { - iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, - solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, iZone, INST_0); - Add_Solution_To_External(iZone); - } + driver_config->SetOuterIter(iOuterIter); - /*--- Loop over the number of outer iterations. ---*/ + for (iZone = 0; iZone < nZone; iZone++) + config_container[iZone]->SetOuterIter(iOuterIter); - for (unsigned long iOuterIter = 0, StopCalc = false; !StopCalc; iOuterIter++) { + /*--- For the adjoint iteration we need the derivatives of the iteration function with + * respect to the state (and possibly the mesh coordinate) variables. + * Since these derivatives do not change in the steady state case we only have to record + * if the current recording is different from them. + * + * To set the tape appropriately, the following recording methods are provided: + * (1) NONE: All information from a previous recording is removed. + * (2) FLOW_CONS_VARS: State variables of all solvers in a zone as input. + * (3) MESH_COORDS: Mesh coordinates as input. + * (4) COMBINED: Mesh coordinates and state variables as input. + * + * By default, all (state and mesh coordinate variables) will be declared as output, + * since it does not change the computational effort. ---*/ - driver_config->SetOuterIter(iOuterIter); - for (iZone = 0; iZone < nZone; iZone++) - config_container[iZone]->SetOuterIter(iOuterIter); + /*--- If we want to set up zone-specific tapes (retape), we do not need to record + * here. Otherwise, the whole tape of a coupled run will be created. ---*/ - /*--- For the adjoint iteration we need the derivatives of the iteration function with - * respect to the state (and possibly the mesh coordinate) variables. - * Since these derivatives do not change in the steady state case we only have to record - * if the current recording is different from them. - * - * To set the tape appropriately, the following recording methods are provided: - * (1) NONE: All information from a previous recording is removed. - * (2) FLOW_CONS_VARS: State variables of all solvers in a zone as input. - * (3) MESH_COORDS: Mesh coordinates as input. - * (4) COMBINED: Mesh coordinates and state variables as input. - * - * By default, all (state and mesh coordinate variables) will be declared as output, - * since it does not change the computational effort. ---*/ + if (!retape && (RecordingState != FLOW_CONS_VARS)) { + SetRecording(NONE, Kind_Tape::FULL_TAPE, ZONE_0); + SetRecording(FLOW_CONS_VARS, Kind_Tape::FULL_TAPE, ZONE_0); + } + /*-- Start loop over zones. ---*/ - /*--- If we want to set up zone-specific tapes (retape), we do not need to record - * here. Otherwise, the whole tape of a coupled run will be created. ---*/ + for (iZone = 0; iZone < nZone; iZone++) { - if (!retape && (RecordingState != FLOW_CONS_VARS)) { + if (retape) { SetRecording(NONE, Kind_Tape::FULL_TAPE, ZONE_0); - SetRecording(FLOW_CONS_VARS, Kind_Tape::FULL_TAPE, ZONE_0); + SetRecording(FLOW_CONS_VARS, Kind_Tape::ZONE_SPECIFIC_TAPE, iZone); } - /*-- Start loop over zones. ---*/ - - for (iZone = 0; iZone < nZone; iZone++) { - - if (retape) { - SetRecording(NONE, Kind_Tape::FULL_TAPE, ZONE_0); - SetRecording(FLOW_CONS_VARS, Kind_Tape::ZONE_SPECIFIC_TAPE, iZone); - } - - /*--- Start inner iterations from where we stopped in previous outer iteration. ---*/ + /*--- Start inner iterations from where we stopped in previous outer iteration. ---*/ - Set_Solution_To_BGSSolution(iZone); + Set_Solution_To_BGSSolution(iZone); - /*--- Inner loop to allow for multiple adjoint updates with respect to solvers in iZone. ---*/ + /*--- Inner loop to allow for multiple adjoint updates with respect to solvers in iZone. ---*/ - bool eval_transfer = false; + bool eval_transfer = false; - for (unsigned short iInnerIter = 0; iInnerIter < nInnerIter[iZone]; iInnerIter++) { + for (unsigned short iInnerIter = 0; iInnerIter < nInnerIter[iZone]; iInnerIter++) { - config_container[iZone]->SetInnerIter(iInnerIter); + config_container[iZone]->SetInnerIter(iInnerIter); - /*--- Add off-diagonal contribution (including the OF gradient) to Solution. ---*/ + /*--- Add off-diagonal contribution (including the OF gradient) to Solution. ---*/ - Add_External_To_Solution(iZone); + Add_External_To_Solution(iZone); - /*--- Evaluate the tape section belonging to solvers in iZone. - * Only evaluate TRANSFER terms on the last iteration or after convergence. ---*/ + /*--- Evaluate the tape section belonging to solvers in iZone. + * Only evaluate TRANSFER terms on the last iteration or after convergence. ---*/ - eval_transfer = eval_transfer || (iInnerIter == nInnerIter[iZone]-1); + eval_transfer = eval_transfer || (iInnerIter == nInnerIter[iZone]-1); - ComputeAdjoints(iZone, eval_transfer); + ComputeAdjoints(iZone, eval_transfer); - /*--- Extracting adjoints for solvers in iZone w.r.t. to outputs in iZone (diagonal part). ---*/ - iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, - solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, iZone, INST_0); + /*--- Extracting adjoints for solvers in iZone w.r.t. to outputs in iZone (diagonal part). ---*/ + iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, + solver_container, numerics_container, config_container, + surface_movement, grid_movement, FFDBox, iZone, INST_0); - /*--- Print out the convergence data to screen and history file ---*/ + /*--- Print out the convergence data to screen and history file ---*/ - bool converged = iteration_container[iZone][INST_0]->Monitor(output_container[iZone], integration_container, - geometry_container, solver_container, numerics_container, - config_container, surface_movement, grid_movement, FFDBox, iZone, INST_0); - if (eval_transfer) break; - eval_transfer = converged; + bool converged = iteration_container[iZone][INST_0]->Monitor(output_container[iZone], integration_container, + geometry_container, solver_container, numerics_container, + config_container, surface_movement, grid_movement, FFDBox, iZone, INST_0); + if (eval_transfer) break; + eval_transfer = converged; - } + } - /*--- Off-diagonal (coupling term) BGS update. ---*/ + /*--- Off-diagonal (coupling term) BGS update. ---*/ - for (unsigned short jZone = 0; jZone < nZone; jZone++) { + for (unsigned short jZone = 0; jZone < nZone; jZone++) { - if (jZone != iZone && interface_container[jZone][iZone] != NULL) { + if (jZone != iZone && interface_container[jZone][iZone] != NULL) { - /*--- Extracting adjoints for solvers in jZone w.r.t. to the output of all solvers in iZone, - * that is, for the cases iZone != jZone we are evaluating cross derivatives between zones. ---*/ + /*--- Extracting adjoints for solvers in jZone w.r.t. to the output of all solvers in iZone, + * that is, for the cases iZone != jZone we are evaluating cross derivatives between zones. ---*/ - iteration_container[jZone][INST_0]->Iterate(output_container[jZone], integration_container, geometry_container, - solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, jZone, INST_0); + iteration_container[jZone][INST_0]->Iterate(output_container[jZone], integration_container, geometry_container, + solver_container, numerics_container, config_container, + surface_movement, grid_movement, FFDBox, jZone, INST_0); - /*--- Extract the cross-term performing a relaxed update of it and of the sum (External) for jZone. ---*/ + /*--- Extract the cross-term performing a relaxed update of it and of the sum (External) for jZone. ---*/ - Update_Cross_Term(iZone, jZone); - } + Update_Cross_Term(iZone, jZone); } - - /*--- Save Solution to Solution_BGS and compute residual from Solution_BGS and Solution_BGS_k. ---*/ - - SetResidual_BGS(iZone); - - /*--- Save Solution to Solution_BGS_k for a next outer iteration. - * (Solution might be overwritten when entering another zone because of cross derivatives.) ---*/ - - Set_BGSSolution(iZone); } - /*--- Set the multizone output. ---*/ + /*--- Save Solution to Solution_BGS and compute residual from Solution_BGS and Solution_BGS_k. ---*/ - driver_output->SetMultizoneHistory_Output(output_container, config_container, driver_config, TimeIter, iOuterIter); + SetResidual_BGS(iZone); - /*--- Check for convergence. ---*/ + /*--- Save Solution to Solution_BGS_k for a next outer iteration. + * (Solution might be overwritten when entering another zone because of cross derivatives.) ---*/ - StopCalc = driver_output->GetConvergence() || (iOuterIter == nOuterIter-1); + Set_BGSSolution(iZone); + } - /*--- Clear the stored adjoint information to be ready for a new evaluation. ---*/ + /*--- Set the multizone output. ---*/ - AD::ClearAdjoints(); + driver_output->SetMultizoneHistory_Output(output_container, config_container, driver_config, TimeIter, iOuterIter); - /*--- Compute the geometrical sensitivities and write them to file. ---*/ + /*--- Check for convergence. ---*/ - bool checkSensitivity = StopCalc || ((iOuterIter % wrt_sol_freq == 0) && (iOuterIter != 0)); + StopCalc = driver_output->GetConvergence() || (iOuterIter == nOuterIter-1); - if (checkSensitivity) { - if (!time_domain) EvaluateSensitivities(iOuterIter, StopCalc); - else EvaluateSensitivities(TimeIter, StopCalc); - } - } + /*--- Clear the stored adjoint information to be ready for a new evaluation. ---*/ - /*--- Output the solution in files for each time iteration. ---*/ + AD::ClearAdjoints(); - Output(TimeIter); + /*--- Compute the geometrical sensitivities and write them to file. ---*/ - TimeIter++; + bool checkSensitivity = StopCalc || ((iOuterIter % wrt_sol_freq == 0) && (iOuterIter != 0)); + + if (checkSensitivity) + EvaluateSensitivities(iOuterIter, StopCalc);//Pass TimeIter instead? } } @@ -404,11 +396,13 @@ void CDiscAdjMultizoneDriver::EvaluateSensitivities(unsigned long iOuterIter, bo AD::ClearAdjoints(); - for (iZone = 0; iZone < nZone; iZone++) { + if (!driver_config->GetTime_Domain()) {//Output files for each time iteration are handled in Output(TimeIter) + for (iZone = 0; iZone < nZone; iZone++) { - output_container[iZone]->SetResult_Files(geometry_container[iZone][INST_0][MESH_0], - config_container[iZone], - solver_container[iZone][INST_0][MESH_0], iOuterIter, StopCalc); + output_container[iZone]->SetResult_Files(geometry_container[iZone][INST_0][MESH_0], + config_container[iZone], + solver_container[iZone][INST_0][MESH_0], iOuterIter, StopCalc); + } } } From 3bf36333213cab291abb73aa7e99f833d76e2c02 Mon Sep 17 00:00:00 2001 From: cvencro Date: Tue, 19 Nov 2019 15:02:31 +0000 Subject: [PATCH 28/82] use multizone driver for FSI adjoints --- SU2_CFD/src/SU2_CFD.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SU2_CFD/src/SU2_CFD.cpp b/SU2_CFD/src/SU2_CFD.cpp index dac3e46bb7f9..54dd597197e8 100644 --- a/SU2_CFD/src/SU2_CFD.cpp +++ b/SU2_CFD/src/SU2_CFD.cpp @@ -123,7 +123,7 @@ int main(int argc, char *argv[]) { driver = new CSinglezoneDriver(config_file_name, nZone, MPICommunicator); } - else if (config->GetMultizone_Problem() && !turbo && !fsi) { + else if (config->GetMultizone_Problem() && !turbo){// && !fsi) { /*--- Multizone Drivers. ---*/ From 1e0805cb2d252626d46f1c0a26a54d563e6e0863 Mon Sep 17 00:00:00 2001 From: cvencro Date: Fri, 22 Nov 2019 17:40:46 +0000 Subject: [PATCH 29/82] allow grid-velocity output by default for dynamic problems --- SU2_CFD/src/output/CFlowCompOutput.cpp | 7 ++++--- SU2_CFD/src/output/CFlowIncOutput.cpp | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/SU2_CFD/src/output/CFlowCompOutput.cpp b/SU2_CFD/src/output/CFlowCompOutput.cpp index 440e54e2f95f..0ee98a90af69 100644 --- a/SU2_CFD/src/output/CFlowCompOutput.cpp +++ b/SU2_CFD/src/output/CFlowCompOutput.cpp @@ -44,7 +44,7 @@ CFlowCompOutput::CFlowCompOutput(CConfig *config, unsigned short nDim) : CFlowOu turb_model = config->GetKind_Turb_Model(); lastInnerIter = curInnerIter; - gridMovement = config->GetGrid_Movement(); + grid_movement = (config->GetGrid_Movement() || config->GetDynamic_Grid()); /*--- Set the default history fields if nothing is set in the config file ---*/ @@ -66,6 +66,7 @@ CFlowCompOutput::CFlowCompOutput(CConfig *config, unsigned short nDim) : CFlowOu if (nRequestedVolumeFields == 0){ requestedVolumeFields.emplace_back("COORDINATES"); requestedVolumeFields.emplace_back("SOLUTION"); + if (grid_movement) requestedVolumeFields.emplace_back("GRID_VELOCITY"); requestedVolumeFields.emplace_back("PRIMITIVE"); nRequestedVolumeFields = requestedVolumeFields.size(); } @@ -315,7 +316,7 @@ void CFlowCompOutput::SetVolumeOutputFields(CConfig *config){ } // Grid velocity - if (config->GetGrid_Movement()){ + if (grid_movement) { AddVolumeOutput("GRID_VELOCITY-X", "Grid_Velocity_x", "GRID_VELOCITY", "x-component of the grid velocity vector"); AddVolumeOutput("GRID_VELOCITY-Y", "Grid_Velocity_y", "GRID_VELOCITY", "y-component of the grid velocity vector"); if (nDim == 3 ) @@ -457,7 +458,7 @@ void CFlowCompOutput::LoadVolumeData(CConfig *config, CGeometry *geometry, CSolv break; } - if (config->GetGrid_Movement()){ + if (grid_movement) { SetVolumeOutputValue("GRID_VELOCITY-X", iPoint, Node_Geo->GetGridVel()[0]); SetVolumeOutputValue("GRID_VELOCITY-Y", iPoint, Node_Geo->GetGridVel()[1]); if (nDim == 3) diff --git a/SU2_CFD/src/output/CFlowIncOutput.cpp b/SU2_CFD/src/output/CFlowIncOutput.cpp index 1b3249df3c9e..c582f0df9d14 100644 --- a/SU2_CFD/src/output/CFlowIncOutput.cpp +++ b/SU2_CFD/src/output/CFlowIncOutput.cpp @@ -47,7 +47,7 @@ CFlowIncOutput::CFlowIncOutput(CConfig *config, unsigned short nDim) : CFlowOutp heat = config->GetEnergy_Equation(); weakly_coupled_heat = config->GetWeakly_Coupled_Heat(); - + grid_movement = (config->GetGrid_Movement() || config->GetDynamic_Grid()); /*--- Set the default history fields if nothing is set in the config file ---*/ if (nRequestedHistoryFields == 0){ @@ -68,6 +68,7 @@ CFlowIncOutput::CFlowIncOutput(CConfig *config, unsigned short nDim) : CFlowOutp if (nRequestedVolumeFields == 0){ requestedVolumeFields.emplace_back("COORDINATES"); requestedVolumeFields.emplace_back("SOLUTION"); + if (grid_movement) requestedVolumeFields.emplace_back("GRID_VELOCITY"); requestedVolumeFields.emplace_back("PRIMITIVE"); nRequestedVolumeFields = requestedVolumeFields.size(); } @@ -351,7 +352,7 @@ void CFlowIncOutput::SetVolumeOutputFields(CConfig *config){ } // Grid velocity - if (config->GetGrid_Movement()){ + if (grid_movement){ AddVolumeOutput("GRID_VELOCITY-X", "Grid_Velocity_x", "GRID_VELOCITY", "x-component of the grid velocity vector"); AddVolumeOutput("GRID_VELOCITY-Y", "Grid_Velocity_y", "GRID_VELOCITY", "y-component of the grid velocity vector"); if (nDim == 3 ) @@ -490,7 +491,7 @@ void CFlowIncOutput::LoadVolumeData(CConfig *config, CGeometry *geometry, CSolve break; } - if (config->GetGrid_Movement()){ + if (grid_movement){ SetVolumeOutputValue("GRID_VELOCITY-X", iPoint, Node_Geo->GetGridVel()[0]); SetVolumeOutputValue("GRID_VELOCITY-Y", iPoint, Node_Geo->GetGridVel()[1]); if (nDim == 3) From af9b53af6e1b95cbd89d515e23230ebe5533dcee Mon Sep 17 00:00:00 2001 From: cvencro Date: Fri, 22 Nov 2019 17:46:14 +0000 Subject: [PATCH 30/82] fix boolean name --- SU2_CFD/src/output/CFlowCompOutput.cpp | 8 ++++---- SU2_CFD/src/output/CFlowIncOutput.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/SU2_CFD/src/output/CFlowCompOutput.cpp b/SU2_CFD/src/output/CFlowCompOutput.cpp index 0ee98a90af69..928430211684 100644 --- a/SU2_CFD/src/output/CFlowCompOutput.cpp +++ b/SU2_CFD/src/output/CFlowCompOutput.cpp @@ -44,7 +44,7 @@ CFlowCompOutput::CFlowCompOutput(CConfig *config, unsigned short nDim) : CFlowOu turb_model = config->GetKind_Turb_Model(); lastInnerIter = curInnerIter; - grid_movement = (config->GetGrid_Movement() || config->GetDynamic_Grid()); + gridMovement = (config->GetGrid_Movement() || config->GetDynamic_Grid()); /*--- Set the default history fields if nothing is set in the config file ---*/ @@ -66,7 +66,7 @@ CFlowCompOutput::CFlowCompOutput(CConfig *config, unsigned short nDim) : CFlowOu if (nRequestedVolumeFields == 0){ requestedVolumeFields.emplace_back("COORDINATES"); requestedVolumeFields.emplace_back("SOLUTION"); - if (grid_movement) requestedVolumeFields.emplace_back("GRID_VELOCITY"); + if (gridMovement) requestedVolumeFields.emplace_back("GRID_VELOCITY"); requestedVolumeFields.emplace_back("PRIMITIVE"); nRequestedVolumeFields = requestedVolumeFields.size(); } @@ -316,7 +316,7 @@ void CFlowCompOutput::SetVolumeOutputFields(CConfig *config){ } // Grid velocity - if (grid_movement) { + if (gridMovement) { AddVolumeOutput("GRID_VELOCITY-X", "Grid_Velocity_x", "GRID_VELOCITY", "x-component of the grid velocity vector"); AddVolumeOutput("GRID_VELOCITY-Y", "Grid_Velocity_y", "GRID_VELOCITY", "y-component of the grid velocity vector"); if (nDim == 3 ) @@ -458,7 +458,7 @@ void CFlowCompOutput::LoadVolumeData(CConfig *config, CGeometry *geometry, CSolv break; } - if (grid_movement) { + if (gridMovement) { SetVolumeOutputValue("GRID_VELOCITY-X", iPoint, Node_Geo->GetGridVel()[0]); SetVolumeOutputValue("GRID_VELOCITY-Y", iPoint, Node_Geo->GetGridVel()[1]); if (nDim == 3) diff --git a/SU2_CFD/src/output/CFlowIncOutput.cpp b/SU2_CFD/src/output/CFlowIncOutput.cpp index c582f0df9d14..edb8587b1149 100644 --- a/SU2_CFD/src/output/CFlowIncOutput.cpp +++ b/SU2_CFD/src/output/CFlowIncOutput.cpp @@ -47,7 +47,7 @@ CFlowIncOutput::CFlowIncOutput(CConfig *config, unsigned short nDim) : CFlowOutp heat = config->GetEnergy_Equation(); weakly_coupled_heat = config->GetWeakly_Coupled_Heat(); - grid_movement = (config->GetGrid_Movement() || config->GetDynamic_Grid()); + gridMovement = (config->GetGrid_Movement() || config->GetDynamic_Grid()); /*--- Set the default history fields if nothing is set in the config file ---*/ if (nRequestedHistoryFields == 0){ @@ -68,7 +68,7 @@ CFlowIncOutput::CFlowIncOutput(CConfig *config, unsigned short nDim) : CFlowOutp if (nRequestedVolumeFields == 0){ requestedVolumeFields.emplace_back("COORDINATES"); requestedVolumeFields.emplace_back("SOLUTION"); - if (grid_movement) requestedVolumeFields.emplace_back("GRID_VELOCITY"); + if (gridMovement) requestedVolumeFields.emplace_back("GRID_VELOCITY"); requestedVolumeFields.emplace_back("PRIMITIVE"); nRequestedVolumeFields = requestedVolumeFields.size(); } @@ -352,7 +352,7 @@ void CFlowIncOutput::SetVolumeOutputFields(CConfig *config){ } // Grid velocity - if (grid_movement){ + if (gridMovement){ AddVolumeOutput("GRID_VELOCITY-X", "Grid_Velocity_x", "GRID_VELOCITY", "x-component of the grid velocity vector"); AddVolumeOutput("GRID_VELOCITY-Y", "Grid_Velocity_y", "GRID_VELOCITY", "y-component of the grid velocity vector"); if (nDim == 3 ) @@ -491,7 +491,7 @@ void CFlowIncOutput::LoadVolumeData(CConfig *config, CGeometry *geometry, CSolve break; } - if (grid_movement){ + if (gridMovement){ SetVolumeOutputValue("GRID_VELOCITY-X", iPoint, Node_Geo->GetGridVel()[0]); SetVolumeOutputValue("GRID_VELOCITY-Y", iPoint, Node_Geo->GetGridVel()[1]); if (nDim == 3) From f8ad8db07211a8209c1f66f7a2d40722fef622da Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 24 Nov 2019 22:32:11 +0000 Subject: [PATCH 31/82] correct time files for dynamic fsi --- Common/src/geometry_structure.cpp | 2 +- .../src/drivers/CDiscAdjMultizoneDriver.cpp | 18 +++++++++--------- SU2_CFD/src/iteration_structure.cpp | 12 ++++++++---- SU2_CFD/src/output/CElasticityOutput.cpp | 4 ++++ SU2_CFD/src/solvers/CMeshSolver.cpp | 4 ++-- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/Common/src/geometry_structure.cpp b/Common/src/geometry_structure.cpp index b635aa857fc9..a0cff5a17ec6 100644 --- a/Common/src/geometry_structure.cpp +++ b/Common/src/geometry_structure.cpp @@ -2724,7 +2724,7 @@ void CGeometry::UpdateGeometry(CGeometry **geometry_container, CConfig *config) geometry_container[MESH_0]->InitiateComms(geometry_container[MESH_0], config, COORDINATES); geometry_container[MESH_0]->CompleteComms(geometry_container[MESH_0], config, COORDINATES); - if (config->GetGrid_Movement()){ + if (config->GetGrid_Movement() || config->GetDynamic_Grid()){ geometry_container[MESH_0]->InitiateComms(geometry_container[MESH_0], config, GRID_VELOCITY); geometry_container[MESH_0]->CompleteComms(geometry_container[MESH_0], config, GRID_VELOCITY); } diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index 3e1620f06153..39ab6b1f6d3a 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -125,18 +125,18 @@ void CDiscAdjMultizoneDriver::StartSolver() { cout << "The simulation will run for " << driver_config->GetnTime_Iter() << " time steps." << endl; } - for (iZone = 0; iZone < nZone; iZone++) { + while ( TimeIter < driver_config->GetnTime_Iter()) { - /*--- Set current time iteration ---*/ - config_container[iZone]->SetTimeIter(TimeIter); + for (iZone = 0; iZone < nZone; iZone++) { - if (time_domain) - config_container[iZone]->SetPhysicalTime(static_cast(TimeIter)*config_container[iZone]->GetDelta_UnstTimeND()); - else - config_container[iZone]->SetPhysicalTime(0.0); - } + /*--- Set current time iteration ---*/ + config_container[iZone]->SetTimeIter(TimeIter); - while ( TimeIter < driver_config->GetnTime_Iter()) { + if (time_domain) + config_container[iZone]->SetPhysicalTime(static_cast(TimeIter)*config_container[iZone]->GetDelta_UnstTimeND()); + else + config_container[iZone]->SetPhysicalTime(0.0); + } /*--- Size and initialize the matrix of cross-terms. ---*/ diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 838cde02ee2d..401d57141e56 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -2098,14 +2098,21 @@ void CDiscAdjFluidIteration::Preprocess(COutput *output, LoadUnsteady_Solution(geometry, solver,config, val_iInst, val_iZone, Direct_Iter); - } else if ((TimeIter > 0) && dual_time) { + if (config[val_iZone]->GetDeform_Mesh()) { + solver[val_iZone][val_iInst][MESH_0][MESH_SOL]->LoadRestart(geometry[val_iZone][val_iInst], solver[val_iZone][val_iInst], config[val_iZone], Direct_Iter, true); + } + } else if ((TimeIter > 0) && dual_time) { + /*--- Here the primal solutions (only working variables) are loaded and put in the correct order into containers. For ALE the mesh coordinates have to be put into the correct containers as well, i.e. follow the same logic for the solution. Afterwards the GridVelocity is computed based on the Coordinates. ---*/ + if (config[val_iZone]->GetDeform_Mesh()) { + solver[val_iZone][val_iInst][MESH_0][MESH_SOL]->LoadRestart(geometry[val_iZone][val_iInst], solver[val_iZone][val_iInst], config[val_iZone], Direct_Iter, true); + } /*--- Load solution timestep n-1 | n-2 for DualTimestepping 1st | 2nd order ---*/ if (dual_time_1st){ @@ -2278,9 +2285,6 @@ void CDiscAdjFluidIteration::LoadUnsteady_Solution(CGeometry ****geometry, } } } - if (config[val_iZone]->GetDeform_Mesh()) { - solver[val_iZone][val_iInst][MESH_0][MESH_SOL]->LoadRestart(geometry[val_iZone][val_iInst], solver[val_iZone][val_iInst], config[val_iZone], val_DirectIter, true); - } } diff --git a/SU2_CFD/src/output/CElasticityOutput.cpp b/SU2_CFD/src/output/CElasticityOutput.cpp index 01c3d3cade19..b8f999ff8058 100644 --- a/SU2_CFD/src/output/CElasticityOutput.cpp +++ b/SU2_CFD/src/output/CElasticityOutput.cpp @@ -81,6 +81,10 @@ CElasticityOutput::CElasticityOutput(CConfig *config, unsigned short nDim) : COu requestedVolumeFields.emplace_back("COORDINATES"); requestedVolumeFields.emplace_back("SOLUTION"); requestedVolumeFields.emplace_back("STRESS"); + if (dynamic) { + requestedVolumeFields.emplace_back("VELOCITY"); + requestedVolumeFields.emplace_back("ACCELERATION"); + } nRequestedVolumeFields = requestedVolumeFields.size(); } diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index d84f1eda4f63..3093caedabb8 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -816,8 +816,8 @@ void CMeshSolver::Restart_OldGeometry(CGeometry *geometry, CConfig *config) { /*--- Modify file name for an unsteady restart ---*/ int Unst_RestartIter; - if (config->GetRestart()) int Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter())-iStep; - else int Unst_RestartIter = SU2_TYPE::Int(config->GetUnst_AdjointIter())-iStep; + if (config->GetRestart()) Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter()) - SU2_TYPE::Int(config->GetTimeIter())-iStep-1; + else Unst_RestartIter = SU2_TYPE::Int(config->GetUnst_AdjointIter()) - SU2_TYPE::Int(config->GetTimeIter())-iStep-1; string filename_n = config->GetUnsteady_FileName(filename, Unst_RestartIter, ""); /*--- Read the restart data from either an ASCII or binary SU2 file. ---*/ From a4d446cd57cbe8f9af198fe38931f8f205964501 Mon Sep 17 00:00:00 2001 From: cvencro Date: Tue, 26 Nov 2019 12:01:04 +0000 Subject: [PATCH 32/82] remove overwriting of existing solution containers for adjoint --- SU2_CFD/src/iteration_structure.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 367b62f3f563..1bc1ba0e5136 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -494,12 +494,13 @@ void CFluidIteration::Preprocess(COutput *output, bool fsi = config[val_iZone]->GetFSI_Simulation(); unsigned long OuterIter = config[val_iZone]->GetOuterIter(); + bool adjoint = (config[val_iZone]->GetContinuous_Adjoint() || config[val_iZone]->GetDiscrete_Adjoint()); /*--- Set the initial condition for FSI problems with subiterations ---*/ /*--- This is done only in the first block subiteration.---*/ /*--- From then on, the solver reuses the partially converged solution obtained in the previous subiteration ---*/ - if( fsi && ( OuterIter == 0 ) ){ + if( fsi && !adjoint && ( OuterIter == 0 ) ){ solver[val_iZone][val_iInst][MESH_0][FLOW_SOL]->SetInitialCondition(geometry[val_iZone][val_iInst], solver[val_iZone][val_iInst], config[val_iZone], TimeIter); } From 057217f8c03e1787c2240015512e6b96d6a16d46 Mon Sep 17 00:00:00 2001 From: cvencro Date: Wed, 27 Nov 2019 19:48:56 +0000 Subject: [PATCH 33/82] Use initial mesh to set up negative restart request in dual-time --- SU2_CFD/src/solvers/CMeshSolver.cpp | 94 +++++++++++++++++------------ 1 file changed, 55 insertions(+), 39 deletions(-) diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index 7f14349c446c..6c2a3c3fe70e 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -818,64 +818,80 @@ void CMeshSolver::Restart_OldGeometry(CGeometry *geometry, CConfig *config) { int Unst_RestartIter; if (config->GetRestart()) Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter()) - SU2_TYPE::Int(config->GetTimeIter())-iStep-1; else Unst_RestartIter = SU2_TYPE::Int(config->GetUnst_AdjointIter()) - SU2_TYPE::Int(config->GetTimeIter())-iStep-1; - string filename_n = config->GetUnsteady_FileName(filename, Unst_RestartIter, ""); - /*--- Read the restart data from either an ASCII or binary SU2 file. ---*/ + if (Unst_RestartIter < 0) { - if (config->GetRead_Binary_Restart()) { - Read_SU2_Restart_Binary(geometry, config, filename_n); - } else { - Read_SU2_Restart_ASCII(geometry, config, filename_n); + if (rank == MASTER_NODE) cout << "Requested mesh restart filename is negative. Setting initial mesh" << endl; + + /*--- Set loaded solution into correct previous time containers. ---*/ + unsigned long iPoint; + for (iPoint = 0; iPoint < nPoint; iPoint++ ) { + for (unsigned short iDim = 0; iDim < nDim; iDim++){ + if(iStep==1) + nodes->Set_Solution_time_n(iPoint, iDim, nodes->GetSolution(iPoint, iDim)); + else + nodes->Set_Solution_time_n1(iPoint, iDim, nodes->GetSolution(iPoint, iDim)); + } + } } + else { + string filename_n = config->GetUnsteady_FileName(filename, Unst_RestartIter, ""); - /*--- Load data from the restart into correct containers. ---*/ - int counter = 0; - for (iPoint_Global = 0; iPoint_Global < geometry->GetGlobal_nPointDomain(); iPoint_Global++ ) { + /*--- Read the restart data from either an ASCII or binary SU2 file. ---*/ - /*--- Retrieve local index. If this node from the restart file lives - on the current processor, we will load and instantiate the vars. ---*/ + if (config->GetRead_Binary_Restart()) { + Read_SU2_Restart_Binary(geometry, config, filename_n); + } else { + Read_SU2_Restart_ASCII(geometry, config, filename_n); + } - long iPoint_Local = geometry->GetGlobal_to_Local_Point(iPoint_Global); + /*--- Load data from the restart into correct containers. ---*/ + int counter = 0; + for (iPoint_Global = 0; iPoint_Global < geometry->GetGlobal_nPointDomain(); iPoint_Global++ ) { - if (iPoint_Local > -1) { + /*--- Retrieve local index. If this node from the restart file lives + on the current processor, we will load and instantiate the vars. ---*/ - /*--- We need to store this point's data, so jump to the correct - offset in the buffer of data from the restart file and load it. ---*/ + long iPoint_Local = geometry->GetGlobal_to_Local_Point(iPoint_Global); - unsigned long index = counter*Restart_Vars[1]; - for (unsigned short iDim = 0; iDim < nDim; iDim++){ - curr_coord = Restart_Data[index+iDim]; - displ = curr_coord - nodes->GetMesh_Coord(iPoint_Local,iDim); + if (iPoint_Local > -1) { - if(iStep==1) - nodes->Set_Solution_time_n(iPoint_Local, iDim, displ); - else - nodes->Set_Solution_time_n1(iPoint_Local, iDim, displ); - } - iPoint_Global_Local++; + /*--- We need to store this point's data, so jump to the correct + offset in the buffer of data from the restart file and load it. ---*/ - /*--- Increment the overall counter for how many points have been loaded. ---*/ - counter++; - } + unsigned long index = counter*Restart_Vars[1]; + for (unsigned short iDim = 0; iDim < nDim; iDim++){ + curr_coord = Restart_Data[index+iDim]; + displ = curr_coord - nodes->GetMesh_Coord(iPoint_Local,iDim); - } + if(iStep==1) + nodes->Set_Solution_time_n(iPoint_Local, iDim, displ); + else + nodes->Set_Solution_time_n1(iPoint_Local, iDim, displ); + } + iPoint_Global_Local++; - /*--- Detect a wrong solution file ---*/ + /*--- Increment the overall counter for how many points have been loaded. ---*/ + counter++; + } + } - if (iPoint_Global_Local < nPointDomain) { sbuf_NotMatching = 1; } + /*--- Detect a wrong solution file ---*/ - SU2_MPI::Allreduce(&sbuf_NotMatching, &rbuf_NotMatching, 1, MPI_UNSIGNED_SHORT, MPI_SUM, MPI_COMM_WORLD); + if (iPoint_Global_Local < nPointDomain) { sbuf_NotMatching = 1; } - if (rbuf_NotMatching != 0) { - SU2_MPI::Error(string("The solution file ") + filename_n + string(" doesn't match with the mesh file!\n") + - string("It could be empty lines at the end of the file."), CURRENT_FUNCTION); - } + SU2_MPI::Allreduce(&sbuf_NotMatching, &rbuf_NotMatching, 1, MPI_UNSIGNED_SHORT, MPI_SUM, MPI_COMM_WORLD); - /*--- Delete the class memory that is used to load the restart. ---*/ + if (rbuf_NotMatching != 0) { + SU2_MPI::Error(string("The solution file ") + filename_n + string(" doesn't match with the mesh file!\n") + + string("It could be empty lines at the end of the file."), CURRENT_FUNCTION); + } - if (Restart_Vars != NULL) { delete [] Restart_Vars; Restart_Vars = NULL; } - if (Restart_Data != NULL) { delete [] Restart_Data; Restart_Data = NULL; } + /*--- Delete the class memory that is used to load the restart. ---*/ + if (Restart_Vars != NULL) { delete [] Restart_Vars; Restart_Vars = NULL; } + if (Restart_Data != NULL) { delete [] Restart_Data; Restart_Data = NULL; } + } InitiateComms(geometry, config, CommType); CompleteComms(geometry, config, CommType); } From b2d78cf34a9ba43bbe895b40c7a93cdf28be9943 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sat, 14 Dec 2019 15:34:52 +0000 Subject: [PATCH 34/82] test with Euler wall --- SU2_CFD/src/solver_direct_mean.cpp | 178 ++++++++++++++++++++++++++++- 1 file changed, 176 insertions(+), 2 deletions(-) diff --git a/SU2_CFD/src/solver_direct_mean.cpp b/SU2_CFD/src/solver_direct_mean.cpp index 2c74c8dde1f2..c13f9ec4c196 100644 --- a/SU2_CFD/src/solver_direct_mean.cpp +++ b/SU2_CFD/src/solver_direct_mean.cpp @@ -7804,9 +7804,183 @@ void CEulerSolver::BC_Euler_Wall(CGeometry *geometry, CConfig *config, unsigned short val_marker) { - /*--- Call the equivalent symmetry plane boundary condition. ---*/ - BC_Sym_Plane(geometry, solver_container, conv_numerics, visc_numerics, config, val_marker); + if (false) { + /*--- Call the equivalent symmetry plane boundary condition. ---*/ + BC_Sym_Plane(geometry, solver_container, conv_numerics, visc_numerics, config, val_marker); + } + else { + unsigned short iDim, iVar, jVar, kVar, jDim; + unsigned long iPoint, iVertex; + su2double *Normal = NULL, *GridVel = NULL, Area, UnitNormal[3], *NormalArea, + ProjGridVel = 0.0, turb_ke; + su2double Density_b, StaticEnergy_b, Enthalpy_b, *Velocity_b, Kappa_b, Chi_b, Energy_b, VelMagnitude2_b, Pressure_b; + su2double Density_i, *Velocity_i, ProjVelocity_i = 0.0, Energy_i, VelMagnitude2_i; + su2double **Jacobian_b, **DubDu; + + bool implicit = (config->GetKind_TimeIntScheme_Flow() == EULER_IMPLICIT); + bool tkeNeeded = (config->GetKind_Turb_Model() == SST) || (config->GetKind_Turb_Model() == SST_SUST); + + Normal = new su2double[nDim]; + NormalArea = new su2double[nDim]; + Velocity_b = new su2double[nDim]; + Velocity_i = new su2double[nDim]; + Jacobian_b = new su2double*[nVar]; + DubDu = new su2double*[nVar]; + for (iVar = 0; iVar < nVar; iVar++) { + Jacobian_b[iVar] = new su2double[nVar]; + DubDu[iVar] = new su2double[nVar]; + } + + /*--- Loop over all the vertices on this boundary marker ---*/ + + for (iVertex = 0; iVertex < geometry->nVertex[val_marker]; iVertex++) { + iPoint = geometry->vertex[val_marker][iVertex]->GetNode(); + + /*--- Check if the node belongs to the domain (i.e, not a halo node) ---*/ + + if (geometry->node[iPoint]->GetDomain()) { + + /*--- Normal vector for this vertex (negative for outward convention) ---*/ + + geometry->vertex[val_marker][iVertex]->GetNormal(Normal); + + Area = 0.0; + for (iDim = 0; iDim < nDim; iDim++) Area += Normal[iDim]*Normal[iDim]; + Area = sqrt (Area); + + for (iDim = 0; iDim < nDim; iDim++) { + NormalArea[iDim] = -Normal[iDim]; + UnitNormal[iDim] = -Normal[iDim]/Area; + } + + /*--- Get the state i ---*/ + + VelMagnitude2_i = 0.0; ProjVelocity_i = 0.0; + for (iDim = 0; iDim < nDim; iDim++) { + Velocity_i[iDim] = node[iPoint]->GetVelocity(iDim); + ProjVelocity_i += Velocity_i[iDim]*UnitNormal[iDim]; + VelMagnitude2_i += Velocity_i[iDim]*Velocity_i[iDim]; + } + Density_i = node[iPoint]->GetDensity(); + Energy_i = node[iPoint]->GetEnergy(); + + /*--- Compute the boundary state b ---*/ + + for (iDim = 0; iDim < nDim; iDim++) + Velocity_b[iDim] = Velocity_i[iDim] - ProjVelocity_i * UnitNormal[iDim]; //Force the velocity to be tangential to the surface. + + if (dynamic_grid) { + GridVel = geometry->node[iPoint]->GetGridVel(); + ProjGridVel = 0.0; + for (iDim = 0; iDim < nDim; iDim++) ProjGridVel += GridVel[iDim]*UnitNormal[iDim]; + for (iDim = 0; iDim < nDim; iDim++) Velocity_b[iDim] += GridVel[iDim] - ProjGridVel * UnitNormal[iDim]; + } + + VelMagnitude2_b = 0.0; + for (iDim = 0; iDim < nDim; iDim++) + VelMagnitude2_b += Velocity_b[iDim] * Velocity_b[iDim]; + + /*--- Compute the residual ---*/ + + turb_ke = 0.0; + if (tkeNeeded) turb_ke = solver_container[TURB_SOL]->node[iPoint]->GetSolution(0); + + Density_b = Density_i; + StaticEnergy_b = Energy_i - 0.5 * VelMagnitude2_i - turb_ke; + Energy_b = StaticEnergy_b + 0.5 * VelMagnitude2_b + turb_ke; + + FluidModel->SetTDState_rhoe(Density_b, StaticEnergy_b); + Kappa_b = FluidModel->GetdPde_rho() / Density_b; + Chi_b = FluidModel->GetdPdrho_e() - Kappa_b * StaticEnergy_b; + Pressure_b = FluidModel->GetPressure(); + Enthalpy_b = Energy_b + Pressure_b/Density_b; + + numerics->GetInviscidProjFlux(&Density_b, Velocity_b, &Pressure_b, &Enthalpy_b, NormalArea, Residual); + + /*--- Grid velocity correction to the energy term ---*/ + if (dynamic_grid) { + GridVel = geometry->node[iPoint]->GetGridVel(); + ProjGridVel = 0.0; + for (iDim = 0; iDim < nDim; iDim++) + ProjGridVel += GridVel[iDim]*UnitNormal[iDim]; + Residual[nVar-1] += Pressure_b*ProjGridVel*Area; + } + + /*--- Add the Reynolds stress tensor contribution ---*/ + + if (tkeNeeded) { + for (iDim = 0; iDim < nDim; iDim++) + Residual[iDim+1] += (2.0/3.0)*Density_b*turb_ke*NormalArea[iDim]; + } + + /*--- Add value to the residual ---*/ + + LinSysRes.AddBlock(iPoint, Residual); + + /*--- Form Jacobians for implicit computations ---*/ + + if (implicit) { + + /*--- Initialize Jacobian ---*/ + + for (iVar = 0; iVar < nVar; iVar++) { + for (jVar = 0; jVar < nVar; jVar++) + Jacobian_i[iVar][jVar] = 0.0; + } + + /*--- Compute DubDu ---*/ + + for (iVar = 0; iVar < nVar; iVar++) { + for (jVar = 0; jVar < nVar; jVar++) + DubDu[iVar][jVar]= 0.0; + DubDu[iVar][iVar]= 1.0; + } + + for (iDim = 0; iDim < nDim; iDim++) + for (jDim = 0; jDimGetInviscidProjJac(Velocity_b, &Enthalpy_b, &Chi_b, &Kappa_b, NormalArea, 1, Jacobian_b); + + // Check for grid movement, should be already considered since Jacobian b is computed from u_b + // if (grid_movement) { + // Jacobian_b[nVar-1][0] += 0.5*ProjGridVel*ProjGridVel; + // for (iDim = 0; iDim < nDim; iDim++) + // Jacobian_b[nVar-1][iDim+1] -= ProjGridVel * UnitNormal[iDim]; + // } + + /*--- Compute numerical flux Jacobian at node i ---*/ + + for (iVar = 0; iVar < nVar; iVar++) + for (jVar = 0; jVar < nVar; jVar++) + for (kVar = 0; kVar < nVar; kVar++) + Jacobian_i[iVar][jVar] += Jacobian_b[iVar][kVar] * DubDu[kVar][jVar]; + + /*--- Add the Jacobian to the sparse matrix ---*/ + + Jacobian.AddBlock(iPoint, iPoint, Jacobian_i); + } + } + } + + delete [] Normal; + delete [] NormalArea; + delete [] Velocity_b; + delete [] Velocity_i; + for (iVar = 0; iVar < nVar; iVar++) { + delete [] Jacobian_b[iVar]; + delete [] DubDu[iVar]; + } + delete [] Jacobian_b; + delete [] DubDu; + } } From 668705299e22f1f1e3d4b02b5036b0945f0976f3 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sat, 14 Dec 2019 16:41:29 +0000 Subject: [PATCH 35/82] fix node and numerics calls --- SU2_CFD/src/solver_direct_mean.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SU2_CFD/src/solver_direct_mean.cpp b/SU2_CFD/src/solver_direct_mean.cpp index c13f9ec4c196..4c839ba28ed9 100644 --- a/SU2_CFD/src/solver_direct_mean.cpp +++ b/SU2_CFD/src/solver_direct_mean.cpp @@ -7857,12 +7857,12 @@ void CEulerSolver::BC_Euler_Wall(CGeometry *geometry, VelMagnitude2_i = 0.0; ProjVelocity_i = 0.0; for (iDim = 0; iDim < nDim; iDim++) { - Velocity_i[iDim] = node[iPoint]->GetVelocity(iDim); + Velocity_i[iDim] = nodes->GetVelocity(iPoint, iDim); ProjVelocity_i += Velocity_i[iDim]*UnitNormal[iDim]; VelMagnitude2_i += Velocity_i[iDim]*Velocity_i[iDim]; } - Density_i = node[iPoint]->GetDensity(); - Energy_i = node[iPoint]->GetEnergy(); + Density_i = nodes->GetDensity(iPoint); + Energy_i = nodes->GetEnergy(iPoint); /*--- Compute the boundary state b ---*/ @@ -7883,7 +7883,7 @@ void CEulerSolver::BC_Euler_Wall(CGeometry *geometry, /*--- Compute the residual ---*/ turb_ke = 0.0; - if (tkeNeeded) turb_ke = solver_container[TURB_SOL]->node[iPoint]->GetSolution(0); + if (tkeNeeded) turb_ke = solver_container[TURB_SOL]->GetNodes()->GetSolution(iPoint, 0); Density_b = Density_i; StaticEnergy_b = Energy_i - 0.5 * VelMagnitude2_i - turb_ke; @@ -7895,7 +7895,7 @@ void CEulerSolver::BC_Euler_Wall(CGeometry *geometry, Pressure_b = FluidModel->GetPressure(); Enthalpy_b = Energy_b + Pressure_b/Density_b; - numerics->GetInviscidProjFlux(&Density_b, Velocity_b, &Pressure_b, &Enthalpy_b, NormalArea, Residual); + conv_numerics->GetInviscidProjFlux(&Density_b, Velocity_b, &Pressure_b, &Enthalpy_b, NormalArea, Residual); /*--- Grid velocity correction to the energy term ---*/ if (dynamic_grid) { @@ -7946,7 +7946,7 @@ void CEulerSolver::BC_Euler_Wall(CGeometry *geometry, /*--- Compute flux Jacobian in state b ---*/ - numerics->GetInviscidProjJac(Velocity_b, &Enthalpy_b, &Chi_b, &Kappa_b, NormalArea, 1, Jacobian_b); + conv_numerics->GetInviscidProjJac(Velocity_b, &Enthalpy_b, &Chi_b, &Kappa_b, NormalArea, 1, Jacobian_b); // Check for grid movement, should be already considered since Jacobian b is computed from u_b // if (grid_movement) { From 690a913663e62e15a5e9c33e8049be7315505ba9 Mon Sep 17 00:00:00 2001 From: cvencro Date: Thu, 19 Dec 2019 18:46:25 +0000 Subject: [PATCH 36/82] Add index calls for dynamic FEA adjoint recording --- SU2_CFD/include/variables/CFEAVariable.hpp | 10 +- SU2_CFD/include/variables/CVariable.hpp | 10 +- SU2_CFD/src/solver_adjoint_elasticity.cpp | 16 ++- SU2_CFD/src/variables/CFEAVariable.cpp | 121 ++++++++++++++++----- 4 files changed, 108 insertions(+), 49 deletions(-) diff --git a/SU2_CFD/include/variables/CFEAVariable.hpp b/SU2_CFD/include/variables/CFEAVariable.hpp index 2ef2c69e5480..907549ccd62d 100644 --- a/SU2_CFD/include/variables/CFEAVariable.hpp +++ b/SU2_CFD/include/variables/CFEAVariable.hpp @@ -390,29 +390,29 @@ class CFEAVariable : public CVariable { * \brief Register the variables in the solution time_n array as input/output variable. * \param[in] input - input or output variables. */ - void Register_femSolution_time_n() final; + void Register_femSolution_time_n(bool input, bool push_index) final; /*! * \brief Register the variables in the velocity array as input/output variable. * \param[in] input - input or output variables. */ - void RegisterSolution_Vel(bool input) final; + void RegisterSolution_Vel(bool input, bool push_index) final; /*! * \brief Register the variables in the velocity time_n array as input/output variable. */ - void RegisterSolution_Vel_time_n() final; + void RegisterSolution_Vel_time_n(bool input, bool push_index) final; /*! * \brief Register the variables in the acceleration array as input/output variable. * \param[in] input - input or output variables. */ - void RegisterSolution_Accel(bool input) final; + void RegisterSolution_Accel(bool input, bool push_index) final; /*! * \brief Register the variables in the acceleration time_n array as input/output variable. */ - void RegisterSolution_Accel_time_n() final; + void RegisterSolution_Accel_time_n(bool input, bool push_index) final; /*! * \brief Set the velocity adjoint values of the solution. diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index 0a9f3369bb0e..3125f0898fa3 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -2485,27 +2485,27 @@ class CVariable { /*! * \brief A virtual member. */ - inline virtual void Register_femSolution_time_n() {} + inline virtual void Register_femSolution_time_n(bool input, bool push_index) {} /*! * \brief A virtual member. */ - inline virtual void RegisterSolution_Vel(bool input) {} + inline virtual void RegisterSolution_Vel(bool input, bool push_index) {} /*! * \brief A virtual member. */ - inline virtual void RegisterSolution_Vel_time_n() {} + inline virtual void RegisterSolution_Vel_time_n(bool input, bool push_index) {} /*! * \brief A virtual member. */ - inline virtual void RegisterSolution_Accel(bool input) {} + inline virtual void RegisterSolution_Accel(bool input, bool push_index) {} /*! * \brief A virtual member. */ - inline virtual void RegisterSolution_Accel_time_n() {} + inline virtual void RegisterSolution_Accel_time_n(bool input, bool push_index) {} /*! * \brief A virtual member. diff --git a/SU2_CFD/src/solver_adjoint_elasticity.cpp b/SU2_CFD/src/solver_adjoint_elasticity.cpp index 6a4ab8fefccd..d7b950fa3252 100644 --- a/SU2_CFD/src/solver_adjoint_elasticity.cpp +++ b/SU2_CFD/src/solver_adjoint_elasticity.cpp @@ -456,15 +456,13 @@ void CDiscAdjFEASolver::RegisterSolution(CGeometry *geometry, CConfig *config){ /*--- Register acceleration (u'') and velocity (u') at time step n ---*/ - direct_solver->GetNodes()->RegisterSolution_Accel(input); - direct_solver->GetNodes()->RegisterSolution_Vel(input); + direct_solver->GetNodes()->RegisterSolution_Accel(input, push_index); + direct_solver->GetNodes()->RegisterSolution_Vel(input, push_index); /*--- Register solution (u), acceleration (u'') and velocity (u') at time step n-1 ---*/ - - direct_solver->GetNodes()->Register_femSolution_time_n(); - direct_solver->GetNodes()->RegisterSolution_Accel_time_n(); - direct_solver->GetNodes()->RegisterSolution_Vel_time_n(); - + direct_solver->GetNodes()->Register_femSolution_time_n(input, push_index); + direct_solver->GetNodes()->RegisterSolution_Accel_time_n(input, push_index); + direct_solver->GetNodes()->RegisterSolution_Vel_time_n(input, push_index); } } @@ -561,8 +559,8 @@ void CDiscAdjFEASolver::RegisterOutput(CGeometry *geometry, CConfig *config){ if (dynamic) { /*--- Register acceleration (u'') and velocity (u') at time step n ---*/ - direct_solver->GetNodes()->RegisterSolution_Accel(input); - direct_solver->GetNodes()->RegisterSolution_Vel(input); + direct_solver->GetNodes()->RegisterSolution_Accel(input, push_index); + direct_solver->GetNodes()->RegisterSolution_Vel(input, push_index); } } diff --git a/SU2_CFD/src/variables/CFEAVariable.cpp b/SU2_CFD/src/variables/CFEAVariable.cpp index 2b21fa6fa58f..d809b2b69edb 100644 --- a/SU2_CFD/src/variables/CFEAVariable.cpp +++ b/SU2_CFD/src/variables/CFEAVariable.cpp @@ -102,46 +102,107 @@ void CFEAVariable::SetSolution_Vel_time_n() { Solution_Vel_time_n = Solution_Vel void CFEAVariable::SetSolution_Accel_time_n() { Solution_Accel_time_n = Solution_Accel; } -void CFEAVariable::Register_femSolution_time_n() { - for (unsigned long iPoint = 0; iPoint < nPoint; iPoint++) - for (unsigned long iVar = 0; iVar < nVar; iVar++) - AD::RegisterInput(Solution_time_n(iPoint,iVar)); +void CFEAVariable::Register_femSolution_time_n(bool input, bool push_index) { + for (unsigned long iPoint = 0; iPoint < nPoint; ++iPoint) { + for(unsigned long iVar=0; iVar Date: Sat, 21 Dec 2019 07:29:23 +0000 Subject: [PATCH 37/82] enable CMeshSolver for FEA adjoints --- SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp | 3 ++- SU2_CFD/src/iteration_structure.cpp | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp index 61a57454a8a5..f159e498ce20 100644 --- a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp @@ -102,7 +102,8 @@ CDiscAdjSinglezoneDriver::CDiscAdjSinglezoneDriver(char* confFile, direct_iteration = new CFEAIteration(config); direct_output = new CElasticityOutput(config, nDim); MainVariables = FEA_DISP_VARS; - SecondaryVariables = MESH_COORDS; + if (mesh_def) SecondaryVariables = MESH_DEFORM; + else SecondaryVariables = MESH_COORDS; break; case DISC_ADJ_HEAT: diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 4509af78d56a..4c41b52dfc20 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -2953,7 +2953,7 @@ void CDiscAdjFEAIteration::SetRecording(CSolver *****solver, void CDiscAdjFEAIteration::RegisterInput(CSolver *****solver, CGeometry ****geometry, CConfig **config, unsigned short iZone, unsigned short iInst, unsigned short kind_recording){ - if(kind_recording != MESH_COORDS) { + if(kind_recording != MESH_COORDS && kind_recording != MESH_DEFORM) { /*--- Register structural displacements as input ---*/ @@ -2966,7 +2966,7 @@ void CDiscAdjFEAIteration::RegisterInput(CSolver *****solver, CGeometry ****geom /*--- Both need to be registered regardless of kind_recording for structural shape derivatives to work properly. Otherwise, the code simply diverges as the FEM_CROSS_TERM_GEOMETRY breaks! (no idea why) for this term we register but do not extract! ---*/ } - else { + else if (kind_recording == MESH_COORDS) { /*--- Register topology optimization densities (note direct solver) ---*/ solver[iZone][iInst][MESH_0][FEA_SOL]->RegisterVariables(geometry[iZone][iInst][MESH_0], config[iZone]); @@ -2975,6 +2975,14 @@ void CDiscAdjFEAIteration::RegisterInput(CSolver *****solver, CGeometry ****geom geometry[iZone][iInst][MESH_0]->RegisterCoordinates(config[iZone]); } + else if (kind_recording == MESH_DEFORM) { + + /*--- Undeformed mesh coordinates ---*/ + solver[iZone][iInst][MESH_0][ADJMESH_SOL]->RegisterSolution(geometry[iZone][iInst][MESH_0], config[iZone]); + + /*--- Boundary displacements ---*/ + solver[iZone][iInst][MESH_0][ADJMESH_SOL]->RegisterVariables(geometry[iZone][iInst][MESH_0], config[iZone]); + } } void CDiscAdjFEAIteration::SetDependencies(CSolver *****solver, CGeometry ****geometry, CNumerics ******numerics, CConfig **config, From 73a32481310678c65d2b57e8c9f3fbb2a0472e23 Mon Sep 17 00:00:00 2001 From: cvencro Date: Thu, 2 Jan 2020 00:07:21 +0000 Subject: [PATCH 38/82] Indexed dynamic FEA adjoint extraction --- SU2_CFD/include/variables/CFEAVariable.hpp | 19 +++++++++++++ SU2_CFD/include/variables/CVariable.hpp | 33 +++++++++++++++++++++- SU2_CFD/src/solver_adjoint_elasticity.cpp | 29 ++++++++++++++++--- SU2_CFD/src/variables/CFEAVariable.cpp | 20 ++++++------- SU2_CFD/src/variables/CVariable.cpp | 12 ++++++++ 5 files changed, 98 insertions(+), 15 deletions(-) diff --git a/SU2_CFD/include/variables/CFEAVariable.hpp b/SU2_CFD/include/variables/CFEAVariable.hpp index 3342e0db19f4..093eaa63f2ba 100644 --- a/SU2_CFD/include/variables/CFEAVariable.hpp +++ b/SU2_CFD/include/variables/CFEAVariable.hpp @@ -422,6 +422,11 @@ class CFEAVariable : public CVariable { adj_sol[iVar] = SU2_TYPE::GetDerivative(Solution_Vel(iPoint,iVar)); } + inline void GetAdjointSolution_Vel_LocalIndex(unsigned long iPoint, su2double *adj_sol) const final { + for (unsigned long iVar = 0; iVar < nVar; iVar++) + adj_sol[iVar] = AD::GetDerivative(AD_Vel_InputIndex(iPoint,iVar)); + } + /*! * \brief Set the velocity adjoint values of the solution at time n. * \param[in] adj_sol - The adjoint values of the solution. @@ -440,6 +445,11 @@ class CFEAVariable : public CVariable { adj_sol[iVar] = SU2_TYPE::GetDerivative(Solution_Vel_time_n(iPoint,iVar)); } + inline void GetAdjointSolution_Vel_time_n_LocalIndex(unsigned long iPoint, su2double *adj_sol) const final { + for (unsigned long iVar = 0; iVar < nVar; iVar++) + adj_sol[iVar] = AD::GetDerivative(AD_Vel_Time_n_InputIndex(iPoint,iVar)); + } + /*! * \brief Set the acceleration adjoint values of the solution. * \param[in] adj_sol - The adjoint values of the solution. @@ -458,6 +468,11 @@ class CFEAVariable : public CVariable { adj_sol[iVar] = SU2_TYPE::GetDerivative(Solution_Accel(iPoint,iVar)); } + inline void GetAdjointSolution_Accel_LocalIndex(unsigned long iPoint, su2double *adj_sol) const final { + for (unsigned long iVar = 0; iVar < nVar; iVar++) + adj_sol[iVar] = AD::GetDerivative(AD_Accel_InputIndex(iPoint,iVar)); + } + /*! * \brief Set the acceleration adjoint values of the solution at time n. * \param[in] adj_sol - The adjoint values of the solution. @@ -476,4 +491,8 @@ class CFEAVariable : public CVariable { adj_sol[iVar] = SU2_TYPE::GetDerivative(Solution_Accel_time_n(iPoint,iVar)); } + inline void GetAdjointSolution_Accel_time_n_LocalIndex(unsigned long iPoint, su2double *adj_sol) const final { + for (unsigned long iVar = 0; iVar < nVar; iVar++) + adj_sol[iVar] = AD::GetDerivative(AD_Accel_Time_n_InputIndex(iPoint,iVar)); + } }; diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index df3e4f8b7c04..60e37d14c551 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -119,6 +119,24 @@ class CVariable { su2matrix AD_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ su2matrix AD_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ + su2matrix AD_Time_n_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ + su2matrix AD_Time_n_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ + + su2matrix AD_Time_n1_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ + su2matrix AD_Time_n1_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ + + su2matrix AD_Vel_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ + su2matrix AD_Vel_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ + + su2matrix AD_Vel_Time_n_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ + su2matrix AD_Vel_Time_n_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ + + su2matrix AD_Accel_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ + su2matrix AD_Accel_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ + + su2matrix AD_Accel_Time_n_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ + su2matrix AD_Accel_Time_n_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ + unsigned long nPoint = {0}; /*!< \brief Number of points in the domain. */ unsigned long nDim = {0}; /*!< \brief Number of dimension of the problem. */ unsigned long nVar = {0}; /*!< \brief Number of variables of the problem. */ @@ -2586,7 +2604,7 @@ class CVariable { * \brief A virtual member. */ inline virtual void GetAdjointSolution_Vel(unsigned long iPoint, su2double *adj_sol) const {} - + inline virtual void GetAdjointSolution_Vel_LocalIndex(unsigned long iPoint, su2double *adj_sol) const {} /*! * \brief A virtual member. */ @@ -2596,6 +2614,7 @@ class CVariable { * \brief A virtual member. */ inline virtual void GetAdjointSolution_Vel_time_n(unsigned long iPoint, su2double *adj_sol) const {} + inline virtual void GetAdjointSolution_Vel_time_n_LocalIndex(unsigned long iPoint, su2double *adj_sol) const {} /*! * \brief A virtual member. @@ -2606,6 +2625,7 @@ class CVariable { * \brief A virtual member. */ inline virtual void GetAdjointSolution_Accel(unsigned long iPoint, su2double *adj_sol) const {} + inline virtual void GetAdjointSolution_Accel_LocalIndex(unsigned long iPoint, su2double *adj_sol) const {} /*! * \brief A virtual member. @@ -2616,6 +2636,7 @@ class CVariable { * \brief A virtual member. */ inline virtual void GetAdjointSolution_Accel_time_n(unsigned long iPoint, su2double *adj_sol) const {} + inline virtual void GetAdjointSolution_Accel_time_n_LocalIndex(unsigned long iPoint, su2double *adj_sol) const {} /*! * \brief Register the variables in the solution array as input/output variable. @@ -2688,6 +2709,11 @@ class CVariable { adj_sol[iVar] = SU2_TYPE::GetDerivative(Solution_time_n(iPoint,iVar)); } + inline void GetAdjointSolution_time_n_LocalIndex(unsigned long iPoint, su2double *adj_sol) const { + for (unsigned long iVar = 0; iVar < nVar; iVar++) + adj_sol[iVar] = AD::GetDerivative(AD_Time_n_InputIndex(iPoint,iVar)); + } + /*! * \brief Set the adjoint values of the solution at time n-1. * \param[in] adj_sol - The adjoint values of the solution. @@ -2706,6 +2732,11 @@ class CVariable { adj_sol[iVar] = SU2_TYPE::GetDerivative(Solution_time_n1(iPoint,iVar)); } + inline void GetAdjointSolution_time_n1_LocalIndex(unsigned long iPoint, su2double *adj_sol) const { + for (unsigned long iVar = 0; iVar < nVar; iVar++) + adj_sol[iVar] = AD::GetDerivative(AD_Time_n1_InputIndex(iPoint,iVar)); + } + /*! * \brief Set the sensitivity at the node * \param[in] iDim - spacial component diff --git a/SU2_CFD/src/solver_adjoint_elasticity.cpp b/SU2_CFD/src/solver_adjoint_elasticity.cpp index 976820a67926..f6be34ed93ed 100644 --- a/SU2_CFD/src/solver_adjoint_elasticity.cpp +++ b/SU2_CFD/src/solver_adjoint_elasticity.cpp @@ -669,7 +669,12 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co /*--- Extract the adjoint acceleration solution u'' ---*/ + if(config->GetMultizone_Problem()) { + direct_solver->GetNodes()->GetAdjointSolution_Accel_LocalIndex(iPoint,Solution_Accel); + } + else { direct_solver->GetNodes()->GetAdjointSolution_Accel(iPoint,Solution_Accel); + } /*--- Store the adjoint acceleration solution u'' ---*/ @@ -685,8 +690,12 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint velocity solution u'' ---*/ - + if(config->GetMultizone_Problem()) { + direct_solver->GetNodes()->GetAdjointSolution_Vel_LocalIndex(iPoint,Solution_Vel); + } + else { direct_solver->GetNodes()->GetAdjointSolution_Vel(iPoint,Solution_Vel); + } /*--- Store the adjoint velocity solution u'' ---*/ @@ -698,8 +707,12 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint solution at time n ---*/ - + if(config->GetMultizone_Problem()) { + direct_solver->GetNodes()->GetAdjointSolution_time_n_LocalIndex(iPoint,Solution); + } + else { direct_solver->GetNodes()->GetAdjointSolution_time_n(iPoint,Solution); + } /*--- Store the adjoint solution at time n ---*/ @@ -710,8 +723,12 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint acceleration solution u'' at time n ---*/ - + if(config->GetMultizone_Problem()) { + direct_solver->GetNodes()->GetAdjointSolution_Accel_time_n_LocalIndex(iPoint,Solution_Accel); + } + else { direct_solver->GetNodes()->GetAdjointSolution_Accel_time_n(iPoint,Solution_Accel); + } /*--- Store the adjoint acceleration solution u'' at time n---*/ @@ -723,8 +740,12 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint velocity solution u' at time n ---*/ - + if(config->GetMultizone_Problem()) { + direct_solver->GetNodes()->GetAdjointSolution_Vel_time_n_LocalIndex(iPoint,Solution_Vel); + } + else { direct_solver->GetNodes()->GetAdjointSolution_Vel_time_n(iPoint,Solution_Vel); + } /*--- Store the adjoint velocity solution u' at time n ---*/ diff --git a/SU2_CFD/src/variables/CFEAVariable.cpp b/SU2_CFD/src/variables/CFEAVariable.cpp index d33d6b9d656a..5c724121f250 100644 --- a/SU2_CFD/src/variables/CFEAVariable.cpp +++ b/SU2_CFD/src/variables/CFEAVariable.cpp @@ -102,13 +102,13 @@ void CFEAVariable::Register_femSolution_time_n(bool input, bool push_index) { } else { AD::RegisterInput(Solution_time_n(iPoint,iVar), false); - AD::SetIndex(AD_InputIndex(iPoint,iVar), Solution_time_n(iPoint,iVar)); + AD::SetIndex(AD_Time_n_InputIndex(iPoint,iVar), Solution_time_n(iPoint,iVar)); } } else { AD::RegisterOutput(Solution_time_n(iPoint,iVar)); if(!push_index) - AD::SetIndex(AD_OutputIndex(iPoint,iVar), Solution_time_n(iPoint,iVar)); + AD::SetIndex(AD_Time_n_OutputIndex(iPoint,iVar), Solution_time_n(iPoint,iVar)); } } } @@ -123,13 +123,13 @@ void CFEAVariable::RegisterSolution_Vel(bool input, bool push_index) { } else { AD::RegisterInput(Solution_Vel(iPoint,iVar), false); - AD::SetIndex(AD_InputIndex(iPoint,iVar), Solution_Vel(iPoint,iVar)); + AD::SetIndex(AD_Vel_InputIndex(iPoint,iVar), Solution_Vel(iPoint,iVar)); } } else { AD::RegisterOutput(Solution_Vel(iPoint,iVar)); if(!push_index) - AD::SetIndex(AD_OutputIndex(iPoint,iVar), Solution_Vel(iPoint,iVar)); + AD::SetIndex(AD_Vel_OutputIndex(iPoint,iVar), Solution_Vel(iPoint,iVar)); } } } @@ -144,13 +144,13 @@ void CFEAVariable::RegisterSolution_Vel_time_n(bool input, bool push_index) { } else { AD::RegisterInput(Solution_Vel_time_n(iPoint,iVar), false); - AD::SetIndex(AD_InputIndex(iPoint,iVar), Solution_Vel_time_n(iPoint,iVar)); + AD::SetIndex(AD_Vel_Time_n_InputIndex(iPoint,iVar), Solution_Vel_time_n(iPoint,iVar)); } } else { AD::RegisterOutput(Solution_Vel_time_n(iPoint,iVar)); if(!push_index) - AD::SetIndex(AD_OutputIndex(iPoint,iVar), Solution_Vel_time_n(iPoint,iVar)); + AD::SetIndex(AD_Vel_Time_n_OutputIndex(iPoint,iVar), Solution_Vel_time_n(iPoint,iVar)); } } } @@ -165,13 +165,13 @@ void CFEAVariable::RegisterSolution_Accel(bool input, bool push_index) { } else { AD::RegisterInput(Solution_Accel(iPoint,iVar), false); - AD::SetIndex(AD_InputIndex(iPoint,iVar), Solution_Accel(iPoint,iVar)); + AD::SetIndex(AD_Accel_InputIndex(iPoint,iVar), Solution_Accel(iPoint,iVar)); } } else { AD::RegisterOutput(Solution_Accel(iPoint,iVar)); if(!push_index) - AD::SetIndex(AD_OutputIndex(iPoint,iVar), Solution_Accel(iPoint,iVar)); + AD::SetIndex(AD_Accel_OutputIndex(iPoint,iVar), Solution_Accel(iPoint,iVar)); } } } @@ -186,13 +186,13 @@ void CFEAVariable::RegisterSolution_Accel_time_n(bool input, bool push_index) { } else { AD::RegisterInput(Solution_Accel_time_n(iPoint,iVar), false); - AD::SetIndex(AD_InputIndex(iPoint,iVar), Solution_Accel_time_n(iPoint,iVar)); + AD::SetIndex(AD_Accel_Time_n_InputIndex(iPoint,iVar), Solution_Accel_time_n(iPoint,iVar)); } } else { AD::RegisterOutput(Solution_Accel_time_n(iPoint,iVar)); if(!push_index) - AD::SetIndex(AD_OutputIndex(iPoint,iVar), Solution_Accel_time_n(iPoint,iVar)); + AD::SetIndex(AD_Accel_Time_n_OutputIndex(iPoint,iVar), Solution_Accel_time_n(iPoint,iVar)); } } } diff --git a/SU2_CFD/src/variables/CVariable.cpp b/SU2_CFD/src/variables/CVariable.cpp index a5179a0acc1e..9ac151fc7637 100644 --- a/SU2_CFD/src/variables/CVariable.cpp +++ b/SU2_CFD/src/variables/CVariable.cpp @@ -73,6 +73,18 @@ CVariable::CVariable(unsigned long npoint, unsigned long ndim, unsigned long nva if(config->GetMultizone_Problem() && config->GetAD_Mode()) { AD_InputIndex.resize(nPoint,nVar) = -1; AD_OutputIndex.resize(nPoint,nVar) = -1; + if (config->GetTime_Domain()) { + AD_Time_n_InputIndex.resize(nPoint,nVar) = -1; + AD_Time_n_OutputIndex.resize(nPoint,nVar) = -1; + AD_Vel_InputIndex.resize(nPoint,nVar) = -1; + AD_Vel_OutputIndex.resize(nPoint,nVar) = -1; + AD_Vel_Time_n_InputIndex.resize(nPoint,nVar) = -1; + AD_Vel_Time_n_OutputIndex.resize(nPoint,nVar) = -1; + AD_Accel_InputIndex.resize(nPoint,nVar) = -1; + AD_Accel_OutputIndex.resize(nPoint,nVar) = -1; + AD_Accel_Time_n_InputIndex.resize(nPoint,nVar) = -1; + AD_Accel_Time_n_OutputIndex.resize(nPoint,nVar) = -1; + } } if (config->GetMultizone_Problem()) From a7c9b8a4114b5aac6f82a06e93b94d16932a56ba Mon Sep 17 00:00:00 2001 From: cvencro Date: Thu, 2 Jan 2020 22:08:36 +0000 Subject: [PATCH 39/82] Extract indexed dynamic fluid adjoint --- Common/src/config_structure.cpp | 2 ++ SU2_CFD/src/solver_adjoint_discrete.cpp | 10 ++++++++++ SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Common/src/config_structure.cpp b/Common/src/config_structure.cpp index 047ddc581b3f..c32f966c06a5 100644 --- a/Common/src/config_structure.cpp +++ b/Common/src/config_structure.cpp @@ -9483,6 +9483,7 @@ void CConfig::SetMultizone(CConfig *driver_config, CConfig **config_container){ unsigned short iZone = 0; /*--- If there is at least a fluid and a structural zone ---*/ + if (nZone > 1) { for (iZone = 0; iZone < nZone; iZone++){ switch (config_container[iZone]->GetKind_Solver()) { case EULER: case NAVIER_STOKES: case RANS: @@ -9495,6 +9496,7 @@ void CConfig::SetMultizone(CConfig *driver_config, CConfig **config_container){ break; } } + } /*--- If the problem has FSI properties ---*/ if (fluid_zone && structural_zone) FSI_Problem = true; diff --git a/SU2_CFD/src/solver_adjoint_discrete.cpp b/SU2_CFD/src/solver_adjoint_discrete.cpp index 2d0ca3ce9f6f..cc41e092df01 100644 --- a/SU2_CFD/src/solver_adjoint_discrete.cpp +++ b/SU2_CFD/src/solver_adjoint_discrete.cpp @@ -489,7 +489,12 @@ void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *confi /*--- Extract the adjoint solution at time n ---*/ + if(config->GetMultizone_Problem()) { + direct_solver->GetNodes()->GetAdjointSolution_time_n_LocalIndex(iPoint,Solution); + } + else { direct_solver->GetNodes()->GetAdjointSolution_time_n(iPoint,Solution); + } /*--- Store the adjoint solution at time n ---*/ @@ -501,7 +506,12 @@ void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *confi /*--- Extract the adjoint solution at time n-1 ---*/ + if(config->GetMultizone_Problem()) { + direct_solver->GetNodes()->GetAdjointSolution_time_n1_LocalIndex(iPoint,Solution); + } + else { direct_solver->GetNodes()->GetAdjointSolution_time_n1(iPoint,Solution); + } /*--- Store the adjoint solution at time n-1 ---*/ diff --git a/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp b/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp index d6c31740b7b5..143990cd0c4d 100644 --- a/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp +++ b/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp @@ -42,7 +42,7 @@ CDiscAdjFEAVariable::CDiscAdjFEAVariable(const su2double *disp, const su2double for (unsigned long iVar = 0; iVar < nVar; iVar++) Solution(iPoint,iVar) = disp[iVar]; - if (fsi) { + if (config->GetMultizone_Problem()) { Cross_Term_Derivative.resize(nPoint,nDim) = su2double(0.0); Geometry_CrossTerm_Derivative.resize(nPoint,nDim) = su2double(0.0); From 7e02810bab32bcce346be7d7cdf6a45424afa2b0 Mon Sep 17 00:00:00 2001 From: cvencro Date: Tue, 21 Jan 2020 19:09:37 +0000 Subject: [PATCH 40/82] update missing AD indices and tidy booleans --- SU2_CFD/include/variables/CVariable.hpp | 4 +-- SU2_CFD/src/solver_adjoint_discrete.cpp | 34 +++++++++++-------- SU2_CFD/src/solver_adjoint_elasticity.cpp | 31 +++++++++++------ SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp | 2 +- SU2_CFD/src/variables/CVariable.cpp | 34 ++++++++++++++----- 5 files changed, 68 insertions(+), 37 deletions(-) diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index 60e37d14c551..be6d0166212a 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -2648,12 +2648,12 @@ class CVariable { /*! * \brief Register the variables in the solution_time_n array as input/output variable. */ - void RegisterSolution_time_n(); + void RegisterSolution_time_n(bool push_index); /*! * \brief Register the variables in the solution_time_n1 array as input/output variable. */ - void RegisterSolution_time_n1(); + void RegisterSolution_time_n1(bool push_index); /*! * \brief Set the adjoint values of the solution. diff --git a/SU2_CFD/src/solver_adjoint_discrete.cpp b/SU2_CFD/src/solver_adjoint_discrete.cpp index cc41e092df01..6b19f79c1091 100644 --- a/SU2_CFD/src/solver_adjoint_discrete.cpp +++ b/SU2_CFD/src/solver_adjoint_discrete.cpp @@ -258,10 +258,10 @@ void CDiscAdjSolver::RegisterSolution(CGeometry *geometry, CConfig *config) { direct_solver->GetNodes()->RegisterSolution(input, push_index); if (time_n_needed) - direct_solver->GetNodes()->RegisterSolution_time_n(); + direct_solver->GetNodes()->RegisterSolution_time_n(push_index); if (time_n1_needed) - direct_solver->GetNodes()->RegisterSolution_time_n1(); + direct_solver->GetNodes()->RegisterSolution_time_n1(push_index); } void CDiscAdjSolver::RegisterVariables(CGeometry *geometry, CConfig *config, bool reset) { @@ -472,7 +472,7 @@ void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *confi /*--- Extract the adjoint solution ---*/ - if(config->GetMultizone_Problem()) { + if(multizone) { direct_solver->GetNodes()->GetAdjointSolution_LocalIndex(iPoint,Solution); } else { @@ -489,7 +489,7 @@ void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *confi /*--- Extract the adjoint solution at time n ---*/ - if(config->GetMultizone_Problem()) { + if(multizone) { direct_solver->GetNodes()->GetAdjointSolution_time_n_LocalIndex(iPoint,Solution); } else { @@ -506,7 +506,7 @@ void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *confi /*--- Extract the adjoint solution at time n-1 ---*/ - if(config->GetMultizone_Problem()) { + if(multizone) { direct_solver->GetNodes()->GetAdjointSolution_time_n1_LocalIndex(iPoint,Solution); } else { @@ -593,7 +593,7 @@ void CDiscAdjSolver::ExtractAdjoint_Geometry(CGeometry *geometry, CConfig *confi // unsigned short iVar; unsigned long iPoint; - + bool multizone = config->GetMultizone_Problem(); /*--- Set Residuals to zero ---*/ // for (iVar = 0; iVar < nVar; iVar++){ @@ -609,7 +609,7 @@ void CDiscAdjSolver::ExtractAdjoint_Geometry(CGeometry *geometry, CConfig *confi /*--- Extract the adjoint solution ---*/ - if (config->GetMultizone_Problem()) + if (multizone) geometry->node[iPoint]->GetAdjointCoord_LocalIndex(Solution_Geometry); else geometry->node[iPoint]->GetAdjointCoord(Solution_Geometry); @@ -663,12 +663,16 @@ void CDiscAdjSolver::ExtractAdjoint_CrossTerm(CGeometry *geometry, CConfig *conf unsigned short iVar; unsigned long iPoint; + bool multizone = config->GetMultizone_Problem(); for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint solution ---*/ + if (multizone) direct_solver->GetNodes()->GetAdjointSolution_LocalIndex(iPoint,Solution); + else + direct_solver->GetNodes()->GetAdjointSolution(iPoint,Solution); for (iVar = 0; iVar < nVar; iVar++) nodes->SetCross_Term_Derivative(iPoint,iVar, Solution[iVar]); @@ -680,13 +684,13 @@ void CDiscAdjSolver::ExtractAdjoint_CrossTerm_Geometry(CGeometry *geometry, CCon unsigned short iDim; unsigned long iPoint; - + bool multizone = config->GetMultizone_Problem(); for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint solution ---*/ - if (config->GetMultizone_Problem()) + if (multizone) geometry->node[iPoint]->GetAdjointCoord_LocalIndex(Solution_Geometry); else geometry->node[iPoint]->GetAdjointCoord(Solution_Geometry); @@ -701,13 +705,13 @@ void CDiscAdjSolver::ExtractAdjoint_CrossTerm_Geometry_Flow(CGeometry *geometry, unsigned short iDim; unsigned long iPoint; - + bool multizone = config->GetMultizone_Problem(); for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint solution ---*/ - if (config->GetMultizone_Problem()) + if (multizone) geometry->node[iPoint]->GetAdjointCoord_LocalIndex(Solution_Geometry); else geometry->node[iPoint]->GetAdjointCoord(Solution_Geometry); @@ -724,7 +728,7 @@ void CDiscAdjSolver::SetAdjoint_Output(CGeometry *geometry, CConfig *config) { bool dual_time = (config->GetTime_Marching() == DT_STEPPING_1ST || config->GetTime_Marching() == DT_STEPPING_2ND); bool fsi = config->GetFSI_Simulation(); - + bool multizone = config->GetMultizone_Problem(); unsigned short iVar; unsigned long iPoint; @@ -742,7 +746,7 @@ void CDiscAdjSolver::SetAdjoint_Output(CGeometry *geometry, CConfig *config) { Solution[iVar] += nodes->GetDual_Time_Derivative(iPoint,iVar); } } - if(config->GetMultizone_Problem()) { + if(multizone) { direct_solver->GetNodes()->SetAdjointSolution_LocalIndex(iPoint,Solution); } else { @@ -791,7 +795,7 @@ void CDiscAdjSolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CConf unsigned long iPoint; unsigned short iDim; su2double *Coord, Sensitivity, eps; - + bool multizone = config->GetMultizone_Problem(); bool time_stepping = (config->GetTime_Marching() != STEADY); for (iPoint = 0; iPoint < nPoint; iPoint++) { @@ -799,7 +803,7 @@ void CDiscAdjSolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CConf for (iDim = 0; iDim < nDim; iDim++) { - if(config->GetMultizone_Problem()) { + if(multizone) { Sensitivity = geometry->node[iPoint]->GetAdjointSolution(iDim); } else { diff --git a/SU2_CFD/src/solver_adjoint_elasticity.cpp b/SU2_CFD/src/solver_adjoint_elasticity.cpp index f6be34ed93ed..ec5aad6da564 100644 --- a/SU2_CFD/src/solver_adjoint_elasticity.cpp +++ b/SU2_CFD/src/solver_adjoint_elasticity.cpp @@ -643,7 +643,7 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co /*--- Extract the adjoint solution ---*/ - if(config->GetMultizone_Problem()) { + if(multizone) { direct_solver->GetNodes()->GetAdjointSolution_LocalIndex(iPoint,Solution); } else { @@ -669,7 +669,7 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co /*--- Extract the adjoint acceleration solution u'' ---*/ - if(config->GetMultizone_Problem()) { + if(multizone) { direct_solver->GetNodes()->GetAdjointSolution_Accel_LocalIndex(iPoint,Solution_Accel); } else { @@ -690,7 +690,7 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint velocity solution u'' ---*/ - if(config->GetMultizone_Problem()) { + if(multizone) { direct_solver->GetNodes()->GetAdjointSolution_Vel_LocalIndex(iPoint,Solution_Vel); } else { @@ -707,7 +707,7 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint solution at time n ---*/ - if(config->GetMultizone_Problem()) { + if(multizone) { direct_solver->GetNodes()->GetAdjointSolution_time_n_LocalIndex(iPoint,Solution); } else { @@ -723,7 +723,7 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint acceleration solution u'' at time n ---*/ - if(config->GetMultizone_Problem()) { + if(multizone) { direct_solver->GetNodes()->GetAdjointSolution_Accel_time_n_LocalIndex(iPoint,Solution_Accel); } else { @@ -740,7 +740,7 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint velocity solution u' at time n ---*/ - if(config->GetMultizone_Problem()) { + if(multizone) { direct_solver->GetNodes()->GetAdjointSolution_Vel_time_n_LocalIndex(iPoint,Solution_Vel); } else { @@ -933,12 +933,16 @@ void CDiscAdjFEASolver::ExtractAdjoint_CrossTerm(CGeometry *geometry, CConfig *c unsigned short iVar; unsigned long iPoint; - + bool multizone = config->GetMultizone_Problem(); for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint solution ---*/ - + if(multizone) { direct_solver->GetNodes()->GetAdjointSolution_LocalIndex(iPoint,Solution); + } + else { + direct_solver->GetNodes()->GetAdjointSolution(iPoint,Solution); + } for (iVar = 0; iVar < nVar; iVar++) nodes->SetCross_Term_Derivative(iPoint,iVar, Solution[iVar]); @@ -950,14 +954,18 @@ void CDiscAdjFEASolver::ExtractAdjoint_CrossTerm_Geometry(CGeometry *geometry, C unsigned short iVar; unsigned long iPoint; - + bool multizone = config->GetMultizone_Problem(); su2double relax = config->GetAitkenStatRelax(); for (iPoint = 0; iPoint < nPoint; iPoint++){ /*--- Extract the adjoint solution ---*/ - + if(multizone) { direct_solver->GetNodes()->GetAdjointSolution_LocalIndex(iPoint,Solution); + } + else { + direct_solver->GetNodes()->GetAdjointSolution(iPoint,Solution); + } /*--- Relax and set the solution ---*/ @@ -973,6 +981,7 @@ void CDiscAdjFEASolver::ExtractAdjoint_CrossTerm_Geometry(CGeometry *geometry, C void CDiscAdjFEASolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CConfig *config){ bool time_domain = config->GetTime_Domain(); + bool multizone = config->GetMultizone_Problem(); unsigned short iVar; for (iVar = 0; iVar < nMPROP; iVar++){ @@ -1006,7 +1015,7 @@ void CDiscAdjFEASolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CC su2double Sensitivity; - if(config->GetMultizone_Problem()) { + if(multizone) { Sensitivity = geometry->node[iPoint]->GetAdjointSolution(iDim); } else { diff --git a/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp b/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp index 143990cd0c4d..d6c31740b7b5 100644 --- a/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp +++ b/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp @@ -42,7 +42,7 @@ CDiscAdjFEAVariable::CDiscAdjFEAVariable(const su2double *disp, const su2double for (unsigned long iVar = 0; iVar < nVar; iVar++) Solution(iPoint,iVar) = disp[iVar]; - if (config->GetMultizone_Problem()) { + if (fsi) { Cross_Term_Derivative.resize(nPoint,nDim) = su2double(0.0); Geometry_CrossTerm_Derivative.resize(nPoint,nDim) = su2double(0.0); diff --git a/SU2_CFD/src/variables/CVariable.cpp b/SU2_CFD/src/variables/CVariable.cpp index 9ac151fc7637..eb24adf0357c 100644 --- a/SU2_CFD/src/variables/CVariable.cpp +++ b/SU2_CFD/src/variables/CVariable.cpp @@ -76,6 +76,8 @@ CVariable::CVariable(unsigned long npoint, unsigned long ndim, unsigned long nva if (config->GetTime_Domain()) { AD_Time_n_InputIndex.resize(nPoint,nVar) = -1; AD_Time_n_OutputIndex.resize(nPoint,nVar) = -1; + AD_Time_n1_InputIndex.resize(nPoint,nVar) = -1; + AD_Time_n1_OutputIndex.resize(nPoint,nVar) = -1; AD_Vel_InputIndex.resize(nPoint,nVar) = -1; AD_Vel_OutputIndex.resize(nPoint,nVar) = -1; AD_Vel_Time_n_InputIndex.resize(nPoint,nVar) = -1; @@ -136,14 +138,30 @@ void CVariable::RegisterSolution(bool input, bool push_index) { } } -void CVariable::RegisterSolution_time_n() { - for (unsigned long iPoint = 0; iPoint < nPoint; ++iPoint) - for(unsigned long iVar=0; iVar Date: Fri, 31 Jan 2020 06:38:17 +0000 Subject: [PATCH 41/82] fix unsteady filename in mesh solver --- SU2_CFD/src/solvers/CMeshSolver.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index 08f373e75398..00247e7ceb17 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -776,15 +776,15 @@ cout << "CVC: Debug: Unst_RestartIter = " << Unst_RestartIter << endl; } } else { - string filename = config->GetUnsteady_FileName(filename, Unst_RestartIter, ""); + string filename_n = config->GetUnsteady_FileName(filename, Unst_RestartIter, ""); /*--- Read the restart data from either an ASCII or binary SU2 file. ---*/ if (config->GetRead_Binary_Restart()) { - Read_SU2_Restart_Binary(geometry, config, filename); + Read_SU2_Restart_Binary(geometry, config, filename_n); } else { - Read_SU2_Restart_ASCII(geometry, config, filename); + Read_SU2_Restart_ASCII(geometry, config, filename_n); } /*--- Load data from the restart into correct containers. ---*/ @@ -824,7 +824,7 @@ cout << "CVC: Debug: Unst_RestartIter = " << Unst_RestartIter << endl; /*--- Detect a wrong solution file. ---*/ if (counter != nPointDomain) { - SU2_MPI::Error(string("The solution file ") + filename + string(" doesn't match with the mesh file!\n") + + SU2_MPI::Error(string("The solution file ") + filename_n + string(" doesn't match with the mesh file!\n") + string("It could be empty lines at the end of the file."), CURRENT_FUNCTION); } } From c01d76e5a33e281d07ca6a28c9ff71319aefc9cc Mon Sep 17 00:00:00 2001 From: cvencro Date: Wed, 5 Feb 2020 17:21:22 +0000 Subject: [PATCH 42/82] few fixes --- SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp | 6 +++--- SU2_CFD/src/solvers/CDiscAdjSolver.cpp | 4 ++-- SU2_CFD/src/solvers/CMeshSolver.cpp | 4 +--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index 507a73936859..bb027446ff11 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -336,7 +336,7 @@ void CDiscAdjMultizoneDriver::Run() { bool checkSensitivity = StopCalc || ((iOuterIter % wrt_sol_freq == 0) && (iOuterIter != 0)); if (checkSensitivity) - EvaluateSensitivities(iOuterIter, StopCalc);//Pass TimeIter instead? + EvaluateSensitivities(iOuterIter, StopCalc); } } @@ -385,7 +385,7 @@ void CDiscAdjMultizoneDriver::EvaluateSensitivities(unsigned long iOuterIter, bo case DISC_ADJ_EULER: case DISC_ADJ_NAVIER_STOKES: case DISC_ADJ_RANS: case DISC_ADJ_INC_EULER: case DISC_ADJ_INC_NAVIER_STOKES: case DISC_ADJ_INC_RANS: - if(Has_Deformation(iZone)) { + if(Has_Deformation(iZone) && config_container[iZone]->GetDeform_Mesh()) { solvers[ADJMESH_SOL]->SetSensitivity(geometry, solvers, config); } else { solvers[ADJFLOW_SOL]->SetSensitivity(geometry, solvers, config); @@ -465,7 +465,7 @@ void CDiscAdjMultizoneDriver::SetRecording(unsigned short kind_recording, Kind_T unsigned short type_recording = kind_recording; - if (Has_Deformation(iZone) && (kind_recording == MESH_COORDS)) { + if (Has_Deformation(iZone) && (kind_recording == MESH_COORDS) && config_container[iZone]->GetDeform_Mesh()) { type_recording = MESH_DEFORM; } diff --git a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp index f84230b3905e..9e2781eeced9 100644 --- a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp @@ -820,7 +820,7 @@ void CDiscAdjSolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CConf if ( geometry->node[iPoint]->GetSharpEdge_Distance() < config->GetAdjSharp_LimiterCoeff()*eps ) Sensitivity = 0.0; } - if (!time_stepping) { + if (!time_stepping || multizone) { nodes->SetSensitivity(iPoint,iDim, Sensitivity); } else { nodes->SetSensitivity(iPoint, iDim, nodes->GetSensitivity(iPoint,iDim) + Sensitivity); @@ -1084,4 +1084,4 @@ void CDiscAdjSolver::ComputeResidual_Multizone(CGeometry *geometry, CConfig *con SetResidual_BGS(geometry, config); -} \ No newline at end of file +} diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index 00247e7ceb17..a761ce75eb3f 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -744,8 +744,6 @@ void CMeshSolver::Restart_OldGeometry(CGeometry *geometry, CConfig *config) { if (nZone > 1) filename = config->GetMultizone_FileName(filename, iZone, ""); -// if (config->GetTime_Domain()) -// filename = GetUnsteady_FileName(filename, (int)Iter, ext); /*--- Determine how many files need to be read. ---*/ @@ -759,7 +757,7 @@ void CMeshSolver::Restart_OldGeometry(CGeometry *geometry, CConfig *config) { int Unst_RestartIter; if (config->GetRestart()) Unst_RestartIter = SU2_TYPE::Int(config->GetRestart_Iter()) - SU2_TYPE::Int(config->GetTimeIter())-iStep-1; else Unst_RestartIter = SU2_TYPE::Int(config->GetUnst_AdjointIter()) - SU2_TYPE::Int(config->GetTimeIter())-iStep-1; -cout << "CVC: Debug: Unst_RestartIter = " << Unst_RestartIter << endl; + if (Unst_RestartIter < 0) { if (rank == MASTER_NODE) cout << "Requested mesh restart filename is negative. Setting initial mesh" << endl; From 838345cb94bd0f2c8cdd0407cf6d84ed7931f17f Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 17 Feb 2020 09:50:49 +0000 Subject: [PATCH 43/82] move FEA push indices --- SU2_CFD/src/variables/CFEAVariable.cpp | 11 +++++++++++ SU2_CFD/src/variables/CVariable.cpp | 8 -------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/SU2_CFD/src/variables/CFEAVariable.cpp b/SU2_CFD/src/variables/CFEAVariable.cpp index eaaa96403b64..3662ba76768f 100644 --- a/SU2_CFD/src/variables/CFEAVariable.cpp +++ b/SU2_CFD/src/variables/CFEAVariable.cpp @@ -63,6 +63,17 @@ CFEAVariable::CFEAVariable(const su2double *val_fea, unsigned long npoint, unsig } Solution_Vel_time_n = Solution_Vel; Solution_Accel_time_n = Solution_Accel; + + if(config->GetMultizone_Problem() && config->GetAD_Mode()) { + AD_Vel_InputIndex.resize(nPoint,nVar) = -1; + AD_Vel_OutputIndex.resize(nPoint,nVar) = -1; + AD_Vel_Time_n_InputIndex.resize(nPoint,nVar) = -1; + AD_Vel_Time_n_OutputIndex.resize(nPoint,nVar) = -1; + AD_Accel_InputIndex.resize(nPoint,nVar) = -1; + AD_Accel_OutputIndex.resize(nPoint,nVar) = -1; + AD_Accel_Time_n_InputIndex.resize(nPoint,nVar) = -1; + AD_Accel_Time_n_OutputIndex.resize(nPoint,nVar) = -1; + } } if (fsi_analysis) { diff --git a/SU2_CFD/src/variables/CVariable.cpp b/SU2_CFD/src/variables/CVariable.cpp index 3f6bb1e5b01e..ee85ebfab82c 100644 --- a/SU2_CFD/src/variables/CVariable.cpp +++ b/SU2_CFD/src/variables/CVariable.cpp @@ -78,14 +78,6 @@ CVariable::CVariable(unsigned long npoint, unsigned long ndim, unsigned long nva AD_Time_n_OutputIndex.resize(nPoint,nVar) = -1; AD_Time_n1_InputIndex.resize(nPoint,nVar) = -1; AD_Time_n1_OutputIndex.resize(nPoint,nVar) = -1; - AD_Vel_InputIndex.resize(nPoint,nVar) = -1; - AD_Vel_OutputIndex.resize(nPoint,nVar) = -1; - AD_Vel_Time_n_InputIndex.resize(nPoint,nVar) = -1; - AD_Vel_Time_n_OutputIndex.resize(nPoint,nVar) = -1; - AD_Accel_InputIndex.resize(nPoint,nVar) = -1; - AD_Accel_OutputIndex.resize(nPoint,nVar) = -1; - AD_Accel_Time_n_InputIndex.resize(nPoint,nVar) = -1; - AD_Accel_Time_n_OutputIndex.resize(nPoint,nVar) = -1; } } From ca9a802e3c42d0a5c84e93b29e31463bb09f9b2b Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 17 Feb 2020 11:07:43 +0000 Subject: [PATCH 44/82] fix change in gradient with multi-grid --- SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index 457f7042858a..bf194bfe1615 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -434,7 +434,9 @@ void CDiscAdjMultizoneDriver::SetRecording(unsigned short kind_recording, Kind_T auto solver = solver_container[iZone][INST_0][MESH_0][iSol]; if (solver != NULL) { if (solver->GetAdjoint()) { - solver->SetRecording(geometry_container[iZone][INST_0][MESH_0], config_container[iZone]); + for (unsigned short iMesh = 0; iMesh <= config_container[iZone]->GetnMGLevels(); iMesh++){ + solver_container[iZone][INST_0][iMesh][iSol]->SetRecording(geometry_container[iZone][INST_0][iMesh], config_container[iZone]); + } } } } From 540b538c744fb81b202cef9e46437a2b33366d88 Mon Sep 17 00:00:00 2001 From: cvencro Date: Tue, 18 Feb 2020 07:31:44 +0000 Subject: [PATCH 45/82] fixes for adjoint FSI Driver --- .../include/variables/CDiscAdjFEAVariable.hpp | 5 + .../include/variables/CDiscAdjVariable.hpp | 5 + SU2_CFD/include/variables/CVariable.hpp | 4 + SU2_CFD/src/SU2_CFD.cpp | 2 +- SU2_CFD/src/drivers/CDriver.cpp | 109 ++++++++++++++---- SU2_CFD/src/iteration_structure.cpp | 6 +- SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp | 50 +++++++- SU2_CFD/src/solvers/CDiscAdjSolver.cpp | 22 +++- SU2_CFD/src/solvers/CMeshSolver.cpp | 2 +- SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp | 1 + SU2_CFD/src/variables/CDiscAdjVariable.cpp | 1 + 11 files changed, 169 insertions(+), 38 deletions(-) diff --git a/SU2_CFD/include/variables/CDiscAdjFEAVariable.hpp b/SU2_CFD/include/variables/CDiscAdjFEAVariable.hpp index 75a8f308618e..2708a50e018d 100644 --- a/SU2_CFD/include/variables/CDiscAdjFEAVariable.hpp +++ b/SU2_CFD/include/variables/CDiscAdjFEAVariable.hpp @@ -39,6 +39,7 @@ class CDiscAdjFEAVariable : public CVariable { protected: MatrixType Sensitivity; /* Vector holding the derivative of target functional with respect to the coordinates at this node*/ + MatrixType Sensitivity_Old; /* Previous time sensitivity holder since inner iterations in FSI problems overwrite sensitivity*/ MatrixType Solution_Direct; MatrixType Dynamic_Derivative; @@ -92,6 +93,8 @@ class CDiscAdjFEAVariable : public CVariable { */ inline void SetSensitivity(unsigned long iPoint, unsigned long iDim, su2double val) final { Sensitivity(iPoint,iDim) = val; } + inline void SetSensitivity_Old(unsigned long iPoint, unsigned long iDim, su2double val) final { Sensitivity_Old(iPoint,iDim) = val; } + /*! * \brief Get the Sensitivity at the node * \param[in] iDim - spacial component @@ -99,6 +102,8 @@ class CDiscAdjFEAVariable : public CVariable { */ inline su2double GetSensitivity(unsigned long iPoint, unsigned long iDim) const final { return Sensitivity(iPoint,iDim);} + inline su2double GetSensitivity_Old(unsigned long iPoint, unsigned long iDim) const final { return Sensitivity_Old(iPoint,iDim);} + inline void SetDynamic_Derivative(unsigned long iPoint, unsigned long iVar, su2double der) final { Dynamic_Derivative(iPoint,iVar) = der; } diff --git a/SU2_CFD/include/variables/CDiscAdjVariable.hpp b/SU2_CFD/include/variables/CDiscAdjVariable.hpp index f4c30c808354..fbc6325c2259 100644 --- a/SU2_CFD/include/variables/CDiscAdjVariable.hpp +++ b/SU2_CFD/include/variables/CDiscAdjVariable.hpp @@ -38,6 +38,7 @@ class CDiscAdjVariable final : public CVariable { private: MatrixType Sensitivity; /* Vector holding the derivative of target functional with respect to the coordinates at this node*/ + MatrixType Sensitivity_Old; /* Previous time sensitivity holder since inner iterations in FSI problems overwrite sensitivity*/ MatrixType Solution_Direct; MatrixType DualTime_Derivative; MatrixType DualTime_Derivative_n; @@ -76,6 +77,8 @@ class CDiscAdjVariable final : public CVariable { */ inline void SetSensitivity(unsigned long iPoint, unsigned long iDim, su2double val) override { Sensitivity(iPoint,iDim) = val;} + inline void SetSensitivity_Old(unsigned long iPoint, unsigned long iDim, su2double val) override { Sensitivity_Old(iPoint,iDim) = val;} + /*! * \brief Get the Sensitivity at the node * \param[in] iDim - spacial component @@ -83,6 +86,8 @@ class CDiscAdjVariable final : public CVariable { */ inline su2double GetSensitivity(unsigned long iPoint, unsigned long iDim) const override { return Sensitivity(iPoint,iDim); } + inline su2double GetSensitivity_Old(unsigned long iPoint, unsigned long iDim) const override { return Sensitivity_Old(iPoint,iDim); } + inline void SetDual_Time_Derivative(unsigned long iPoint, unsigned long iVar, su2double der) override { DualTime_Derivative(iPoint,iVar) = der; } inline void SetDual_Time_Derivative_n(unsigned long iPoint, unsigned long iVar, su2double der) override { DualTime_Derivative_n(iPoint,iVar) = der; } diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index 91e9451b6539..4976d3c91818 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -2750,6 +2750,8 @@ class CVariable { */ inline virtual void SetSensitivity(unsigned long iPoint, unsigned long iDim, su2double val) {} + inline virtual void SetSensitivity_Old(unsigned long iPoint, unsigned long iDim, su2double val) {} + /*! * \brief Get the Sensitivity at the node * \param[in] iDim - spacial component @@ -2757,6 +2759,8 @@ class CVariable { */ inline virtual su2double GetSensitivity(unsigned long iPoint, unsigned long iDim) const { return 0.0; } + inline virtual su2double GetSensitivity_Old(unsigned long iPoint, unsigned long iDim) const { return 0.0; } + inline virtual void SetDual_Time_Derivative(unsigned long iPoint, unsigned long iVar, su2double der) {} inline virtual void SetDual_Time_Derivative_n(unsigned long iPoint, unsigned long iVar, su2double der) {} diff --git a/SU2_CFD/src/SU2_CFD.cpp b/SU2_CFD/src/SU2_CFD.cpp index b12c718d4849..42da3947f29f 100644 --- a/SU2_CFD/src/SU2_CFD.cpp +++ b/SU2_CFD/src/SU2_CFD.cpp @@ -132,7 +132,7 @@ int main(int argc, char *argv[]) { } } - else if (multizone && !turbo) {// && !fsi) { + else if (multizone && !turbo && !fsi) { /*--- Generic multizone problems. ---*/ if (disc_adj) { diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index 11913991e061..437b983083cb 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -4796,6 +4796,18 @@ void CDiscAdjFSIDriver::DynamicMeshUpdate(unsigned long ExtIter){ void CDiscAdjFSIDriver::Run( ) { + /*--- Store current time sensitivity ---*///What if restarted? + for (iZone = 0; iZone < nZone; iZone++) { + for (unsigned long iPoint = 0; iPoint < geometry_container[iZone][INST_0][MESH_0]->GetnPoint(); iPoint++) { + for (unsigned short iDim = 0; iDim < nDim; iDim++) { + if (iZone == 0) { + solver_container[iZone][INST_0][MESH_0][ADJFLOW_SOL]->GetNodes()->SetSensitivity_Old(iPoint, iDim, 0.0); + } else if (iZone == 1) { + solver_container[iZone][INST_0][MESH_0][ADJFEA_SOL]->GetNodes()->SetSensitivity_Old(iPoint, iDim, 0.0); + } + } + } + } while ( TimeIter < config_container[ZONE_0]->GetnTime_Iter()) { @@ -4871,6 +4883,40 @@ void CDiscAdjFSIDriver::Run( ) { } + /*--- Add current time sensitivity ---*/ + su2double Sensitivity; + for (iZone = 0; iZone < nZone; iZone++) { + for (unsigned long iPoint = 0; iPoint < geometry_container[iZone][INST_0][MESH_0]->GetnPoint(); iPoint++) { + for (unsigned short iDim = 0; iDim < nDim; iDim++) { + + /*--- Fluid Sensitivity ---*/ + if (iZone == 0) { + /*--- Current time iteration sensitivity ---*/ + Sensitivity = solver_container[iZone][INST_0][MESH_0][ADJFLOW_SOL]->GetNodes()->GetSensitivity(iPoint, iDim); + + /*--- Update old sensitivity container ---*/ + solver_container[iZone][INST_0][MESH_0][ADJFLOW_SOL]->GetNodes()->SetSensitivity_Old(iPoint, iDim, Sensitivity + + solver_container[iZone][INST_0][MESH_0][ADJFLOW_SOL]->GetNodes()->GetSensitivity_Old(iPoint, iDim)); + + /*--- Current time iteration sensitivity ---*/ + solver_container[iZone][INST_0][MESH_0][ADJFLOW_SOL]->GetNodes()->SetSensitivity( + iPoint, iDim, solver_container[iZone][INST_0][MESH_0][ADJFLOW_SOL]->GetNodes()->GetSensitivity_Old(iPoint, iDim)); + /*--- Structure Sensitivity ---*/ + } else if (iZone == 1) { + /*--- Current time iteration sensitivity ---*/ + Sensitivity = solver_container[iZone][INST_0][MESH_0][ADJFEA_SOL]->GetNodes()->GetSensitivity(iPoint, iDim); + + /*--- Update old sensitivity container ---*/ + solver_container[iZone][INST_0][MESH_0][ADJFEA_SOL]->GetNodes()->SetSensitivity_Old(iPoint, iDim, Sensitivity + + solver_container[iZone][INST_0][MESH_0][ADJFEA_SOL]->GetNodes()->GetSensitivity_Old(iPoint, iDim)); + + /*--- Cumulative sensitivity with time ---*/ + solver_container[iZone][INST_0][MESH_0][ADJFEA_SOL]->GetNodes()->SetSensitivity( + iPoint, iDim, solver_container[iZone][INST_0][MESH_0][ADJFEA_SOL]->GetNodes()->GetSensitivity_Old(iPoint, iDim)); + } + } + } + } for (iZone = 0; iZone < nZone; iZone++){ output_container[iZone]->SetResult_Files(geometry_container[iZone][INST_0][MESH_0], @@ -5408,10 +5454,19 @@ void CDiscAdjFSIDriver::Mesh_Deformation_Direct(unsigned short ZONE_FLOW, unsign /*---- as the flag Grid_Movement is set to false in this case -----*/ /*-----------------------------------------------------------------*/ - direct_iteration[ZONE_FLOW]->SetGrid_Movement(geometry_container[ZONE_FLOW][INST_0], + if (config_container[ZONE_FLOW]->GetDeform_Mesh()) { + direct_iteration[ZONE_FLOW]->SetMesh_Deformation(geometry_container[ZONE_FLOW][INST_0], + solver_container[ZONE_FLOW][INST_0][MESH_0], + numerics_container[ZONE_FLOW][INST_0][MESH_0], + config_container[ZONE_FLOW], + MESH_DEFORM); + + } else { + direct_iteration[ZONE_FLOW]->SetGrid_Movement(geometry_container[ZONE_FLOW][INST_0], surface_movement[ZONE_FLOW], grid_movement[ZONE_FLOW][INST_0], solver_container[ZONE_FLOW][INST_0], config_container[ZONE_FLOW], 0, ExtIter ); - + } + geometry_container[ZONE_FLOW][INST_0][MESH_0]->UpdateGeometry(geometry_container[ZONE_FLOW][INST_0], config_container[ZONE_FLOW]); solver_container[ZONE_STRUCT][INST_0][MESH_0][FEA_SOL]->InitiateComms(geometry_container[ZONE_STRUCT][INST_0][MESH_0], config_container[ZONE_STRUCT], SOLUTION_FEA); @@ -5635,7 +5690,13 @@ void CDiscAdjFSIDriver::RegisterOutput(unsigned short ZONE_FLOW, void CDiscAdjFSIDriver::Iterate_Block(unsigned short ZONE_FLOW, unsigned short ZONE_STRUCT, unsigned short kind_recording){ - +// if (rank == MASTER_NODE) { +// cout << "CVC: Debug: CDiscAdjFSIDriver::Iterate_Block: kind_recording = " << kind_recording << endl; +// cout << "CVC: Debug: FLOW_CONS_VARS = 1, MESH_COORDS = 2, COMBINED = 3, FEA_DISP_VARS = 4, FLOW_CROSS_TERM = 5" << endl; +// cout << "FEM_CROSS_TERM_GEOMETRY = 6, GEOMETRY_CROSS_TERM = 7, ALL_VARIABLES = 8, MESH_DEFORM = 9" << endl; +// //CVC: If config->GetDeform_Mesh, use MESH_DEFORM... +// //CVC: Currently, only if FEM_CROSS_TERM_GEOMETRY, CMeshSolver is used +// } unsigned long IntIter=0, nIntIter = 1; bool dual_time_1st = (config_container[ZONE_0]->GetTime_Marching() == DT_STEPPING_1ST); bool dual_time_2nd = (config_container[ZONE_0]->GetTime_Marching() == DT_STEPPING_2ND); @@ -5839,32 +5900,32 @@ bool CDiscAdjFSIDriver::CheckConvergence(unsigned long IntIter, struct_convergence = false, adjoint_convergence = false; -// su2double residual_1, residual_2; + su2double residual_1, residual_2; -// if (kind_recording == FLOW_CONS_VARS) { + if (kind_recording == FLOW_CONS_VARS) { -// /*--- Set the convergence criteria (only residual possible as of now) ---*/ + /*--- Set the convergence criteria (only residual possible as of now) ---*/ -// residual_1 = log10(solver_container[ZONE_FLOW][INST_0][MESH_0][ADJFLOW_SOL]->GetRes_RMS(0)); -// residual_2 = log10(solver_container[ZONE_FLOW][INST_0][MESH_0][ADJFLOW_SOL]->GetRes_RMS(1)); + residual_1 = log10(solver_container[ZONE_FLOW][INST_0][MESH_0][ADJFLOW_SOL]->GetRes_RMS(0)); + residual_2 = log10(solver_container[ZONE_FLOW][INST_0][MESH_0][ADJFLOW_SOL]->GetRes_RMS(1)); -// flow_convergence = ((residual_1 < config_container[ZONE_FLOW]->GetMinLogResidual()) && -// (residual_2 < config_container[ZONE_FLOW]->GetMinLogResidual())); + flow_convergence = ((residual_1 < flow_criteria) &&//config_container[ZONE_FLOW]->GetMinLogResidual()) && + (residual_2 < flow_criteria));//config_container[ZONE_FLOW]->GetMinLogResidual())); -// } + } -// if (kind_recording == FEA_DISP_VARS) { + if (kind_recording == FEA_DISP_VARS) { -// /*--- Set the convergence criteria (only residual possible as of now) ---*/ + /*--- Set the convergence criteria (only residual possible as of now) ---*/ -// residual_1 = log10(solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetRes_RMS(0)); -// residual_2 = log10(solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetRes_RMS(1)); + residual_1 = log10(solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetRes_RMS(0)); + residual_2 = log10(solver_container[ZONE_STRUCT][INST_0][MESH_0][ADJFEA_SOL]->GetRes_RMS(1)); -// // Temporary, until function is added -// struct_convergence = ((residual_1 < config_container[ZONE_STRUCT]->GetResidual_FEM_UTOL()) && -// (residual_2 < config_container[ZONE_STRUCT]->GetResidual_FEM_UTOL())); + // Temporary, until function is added + struct_convergence = ((residual_1 < structure_criteria) &&//config_container[ZONE_STRUCT]->GetResidual_FEM_UTOL()) && + (residual_2 < structure_criteria));//config_container[ZONE_STRUCT]->GetResidual_FEM_UTOL())); -// } + } switch (kind_recording){ case FLOW_CONS_VARS: adjoint_convergence = flow_convergence; break; @@ -6158,11 +6219,15 @@ bool CDiscAdjFSIDriver::BGSConvergence(unsigned long IntIter, void CDiscAdjFSIDriver::Transfer_Displacements(unsigned short donorZone, unsigned short targetZone) { - - interface_container[donorZone][targetZone]->BroadcastData(solver_container[donorZone][INST_0][MESH_0][FEA_SOL],solver_container[targetZone][INST_0][MESH_0][FLOW_SOL], + if (config_container[ZONE_0]->GetDeform_Mesh()) { + interface_container[donorZone][targetZone]->BroadcastData(solver_container[donorZone][INST_0][MESH_0][FEA_SOL],solver_container[targetZone][INST_0][MESH_0][MESH_SOL], + geometry_container[donorZone][INST_0][MESH_0],geometry_container[targetZone][INST_0][MESH_0], + config_container[donorZone],config_container[targetZone]); + } else { + interface_container[donorZone][targetZone]->BroadcastData(solver_container[donorZone][INST_0][MESH_0][FEA_SOL],solver_container[targetZone][INST_0][MESH_0][FLOW_SOL], geometry_container[donorZone][INST_0][MESH_0],geometry_container[targetZone][INST_0][MESH_0], config_container[donorZone], config_container[targetZone]); - + } } void CDiscAdjFSIDriver::Transfer_Tractions(unsigned short donorZone, unsigned short targetZone) { diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 06b74bfd953e..88dc05f1ed0e 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -3056,10 +3056,8 @@ void CDiscAdjFEAIteration::SetDependencies(CSolver *****solver, CGeometry ****ge dir_solver->InitiateComms(structural_geometry, config[iZone], SOLUTION_FEA); dir_solver->CompleteComms(structural_geometry, config[iZone], SOLUTION_FEA); - if (kind_recording == MESH_COORDS) { - structural_geometry->InitiateComms(structural_geometry, config[iZone], COORDINATES); - structural_geometry->CompleteComms(structural_geometry, config[iZone], COORDINATES); - } + structural_geometry->InitiateComms(structural_geometry, config[iZone], COORDINATES); + structural_geometry->CompleteComms(structural_geometry, config[iZone], COORDINATES); /*--- Topology optimization dependencies. ---*/ diff --git a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp index 9647537f9efe..5090d6c4a38f 100644 --- a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp @@ -525,6 +525,9 @@ void CDiscAdjFEASolver::RegisterVariables(CGeometry *geometry, CConfig *config, } } + /*--- Register coordinates ---*/ + geometry->RegisterCoordinates(config); + /*--- Register the flow tractions ---*/ if (config->GetnMarker_Fluid_Load() > 0) direct_solver->GetNodes()->RegisterFlowTraction(); @@ -650,7 +653,8 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co } /*--- Store the adjoint solution ---*/ - +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[0] = " << Solution[0] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[1] = " << Solution[1] << endl; nodes->SetSolution(iPoint,Solution); } @@ -676,7 +680,8 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co } /*--- Store the adjoint acceleration solution u'' ---*/ - +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Accel[0] = " << Solution_Accel[0] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Accel[1] = " << Solution_Accel[1] << endl; nodes->SetSolution_Accel(iPoint,Solution_Accel); } @@ -697,7 +702,8 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co } /*--- Store the adjoint velocity solution u'' ---*/ - +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Vel[0] = " << Solution_Vel[0] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Vel[1] = " << Solution_Vel[1] << endl; nodes->SetSolution_Vel(iPoint,Solution_Vel); } @@ -714,7 +720,8 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co } /*--- Store the adjoint solution at time n ---*/ - +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_n[0] = " << Solution[0] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_n[1] = " << Solution[1] << endl; nodes->Set_Solution_time_n(iPoint,Solution); } @@ -730,7 +737,8 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co } /*--- Store the adjoint acceleration solution u'' at time n---*/ - +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Accel_n[0] = " << Solution_Accel[0] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Accel_n[1] = " << Solution_Accel[1] << endl; nodes->SetSolution_Accel_time_n(iPoint,Solution_Accel); } @@ -747,7 +755,8 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co } /*--- Store the adjoint velocity solution u' at time n ---*/ - +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Vel_n[0] = " << Solution_Vel[0] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Vel_n[1] = " << Solution_Vel[1] << endl; nodes->SetSolution_Vel_time_n(iPoint,Solution_Vel); } @@ -835,6 +844,35 @@ void CDiscAdjFEASolver::ExtractAdjoint_Variables(CGeometry *geometry, CConfig *c SU2_MPI::Allreduce(Local_Sens_DV, Global_Sens_DV, nDV, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); } + /*--- Extract the geometric sensitivities ---*/ + + for (unsigned long iPoint = 0; iPoint < nPoint; iPoint++) { + + su2double *Coord = geometry->node[iPoint]->GetCoord(); + + for (unsigned short iDim = 0; iDim < nDim; iDim++) { + + su2double Sensitivity; + + if(config->GetMultizone_Problem()) { + Sensitivity = geometry->node[iPoint]->GetAdjointSolution(iDim); + } + else { + Sensitivity = SU2_TYPE::GetDerivative(Coord[iDim]); + /*--- Set the index manually to zero. ---*/ + AD::ResetInput(Coord[iDim]); + } + if (!config->GetTime_Domain() || config->GetMultizone_Problem()) { + if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Sensitivity[" << iDim << "] = " << Sensitivity << " (Current only)" << endl; + nodes->SetSensitivity(iPoint, iDim, Sensitivity); + } else { + if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Sensitivity[" << iDim << "] = " << Sensitivity << " (Adding previous = " << nodes->GetSensitivity(iPoint, iDim) << ")" << endl; + nodes->SetSensitivity(iPoint, iDim, nodes->GetSensitivity(iPoint, iDim) + Sensitivity); + } + } + } + SetSurface_Sensitivity(geometry, config); + /*--- Extract the flow traction sensitivities ---*/ if (config->GetnMarker_Fluid_Load() > 0){ diff --git a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp index 5d31247bf312..3c1119ce7b1e 100644 --- a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp @@ -479,7 +479,10 @@ void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *confi } /*--- Store the adjoint solution ---*/ - +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[0] = " << Solution[0] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[1] = " << Solution[1] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[2] = " << Solution[2] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[3] = " << Solution[3] << endl; nodes->SetSolution(iPoint,Solution); } @@ -496,7 +499,10 @@ void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *confi } /*--- Store the adjoint solution at time n ---*/ - +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n[0] = " << Solution[0] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n[1] = " << Solution[1] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n[2] = " << Solution[2] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n[3] = " << Solution[3] << endl; nodes->Set_Solution_time_n(iPoint,Solution); } } @@ -513,7 +519,10 @@ void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *confi } /*--- Store the adjoint solution at time n-1 ---*/ - +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n1[0] = " << Solution[0] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n1[1] = " << Solution[1] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n1[2] = " << Solution[2] << endl; +if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n1[3] = " << Solution[3] << endl; nodes->Set_Solution_time_n1(iPoint,Solution); } } @@ -546,7 +555,10 @@ void CDiscAdjSolver::ExtractAdjoint_Variables(CGeometry *geometry, CConfig *conf Local_Sens_AoA = SU2_TYPE::GetDerivative(Alpha); Local_Sens_Temp = SU2_TYPE::GetDerivative(Temperature); Local_Sens_Press = SU2_TYPE::GetDerivative(Pressure); - +if (rank == MASTER_NODE) cout << "CVC: Debug: Local_Sens_Mach = " << Local_Sens_Mach << endl; +if (rank == MASTER_NODE) cout << "CVC: Debug: Local_Sens_AoA = " << Local_Sens_AoA << endl; +if (rank == MASTER_NODE) cout << "CVC: Debug: Local_Sens_Temp = " << Local_Sens_Temp << endl; +if (rank == MASTER_NODE) cout << "CVC: Debug: Local_Sens_Press = " << Local_Sens_Press << endl; SU2_MPI::Allreduce(&Local_Sens_Mach, &Total_Sens_Mach, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); SU2_MPI::Allreduce(&Local_Sens_AoA, &Total_Sens_AoA, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); SU2_MPI::Allreduce(&Local_Sens_Temp, &Total_Sens_Temp, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); @@ -821,8 +833,10 @@ void CDiscAdjSolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CConf Sensitivity = 0.0; } if (!time_stepping || multizone) { +// if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Sensitivity[" << iDim << "] = " << Sensitivity << " (Current only)" << endl; nodes->SetSensitivity(iPoint,iDim, Sensitivity); } else { +// if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Sensitivity[" << iDim << "] = " << Sensitivity << " (Adding previous = " << nodes->GetSensitivity(iPoint, iDim) << ")" << endl; nodes->SetSensitivity(iPoint, iDim, nodes->GetSensitivity(iPoint,iDim) + Sensitivity); } } diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index 4b6fb62f226b..c465c0a8485b 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -471,7 +471,7 @@ void CMeshSolver::DeformMesh(CGeometry **geometry, CNumerics **numerics, CConfig SetMinMaxVolume(geometry[MESH_0], config, true); /*--- The Grid Velocity is only computed if the problem is time domain ---*/ - if (time_domain) ComputeGridVelocity(geometry[MESH_0], config); + if (time_domain && !config->GetDiscrete_Adjoint()) ComputeGridVelocity(geometry[MESH_0], config); /*--- Update the multigrid structure. ---*/ UpdateMultiGrid(geometry, config); diff --git a/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp b/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp index 3f8a4f378ade..906a41880cea 100644 --- a/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp +++ b/SU2_CFD/src/variables/CDiscAdjFEAVariable.cpp @@ -37,6 +37,7 @@ CDiscAdjFEAVariable::CDiscAdjFEAVariable(const su2double *disp, const su2double Solution_Direct.resize(nPoint,nVar); Sensitivity.resize(nPoint,nDim) = su2double(0.0); + Sensitivity_Old.resize(nPoint,nDim) = su2double(0.0); for (unsigned long iPoint = 0; iPoint < nPoint; ++iPoint) for (unsigned long iVar = 0; iVar < nVar; iVar++) diff --git a/SU2_CFD/src/variables/CDiscAdjVariable.cpp b/SU2_CFD/src/variables/CDiscAdjVariable.cpp index 9d45ce5f0ae9..899617270f49 100644 --- a/SU2_CFD/src/variables/CDiscAdjVariable.cpp +++ b/SU2_CFD/src/variables/CDiscAdjVariable.cpp @@ -47,6 +47,7 @@ CDiscAdjVariable::CDiscAdjVariable(const su2double* sol, unsigned long npoint, u Solution_Direct.resize(nPoint,nVar); Sensitivity.resize(nPoint,nDim) = su2double(0.0); + Sensitivity_Old.resize(nPoint,nDim) = su2double(0.0); for (unsigned long iPoint = 0; iPoint < nPoint; ++iPoint) for (unsigned long iVar = 0; iVar < nVar; ++iVar) From 5891b59271154002d9c9ff2fd2105734de46aa96 Mon Sep 17 00:00:00 2001 From: cvencro Date: Wed, 19 Feb 2020 10:51:18 +0000 Subject: [PATCH 46/82] update unsteady solution and sensitivity --- .../src/drivers/CDiscAdjMultizoneDriver.cpp | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index bf194bfe1615..a7e9b64e48ab 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -338,6 +338,57 @@ void CDiscAdjMultizoneDriver::Run() { if (checkSensitivity) EvaluateSensitivities(iOuterIter, StopCalc); } + + /*--- Add current time sensitivity ---*/ + /*--- Cumulative sensitivity stored here in order to exclude summation within outer iteration ---*/ + for (iZone = 0; iZone < nZone; iZone++) { + + auto solvers = solver_container[iZone][INST_0][MESH_0]; + auto geometry = geometry_container[iZone][INST_0][MESH_0]; + int IDX_SOL;//unsigned short or int? + + switch (config_container[iZone]->GetKind_Solver()) { + case DISC_ADJ_EULER: case DISC_ADJ_NAVIER_STOKES: case DISC_ADJ_RANS: + case DISC_ADJ_INC_EULER: case DISC_ADJ_INC_NAVIER_STOKES: case DISC_ADJ_INC_RANS: + if(config_container[iZone]->GetDeform_Mesh()) IDX_SOL = ADJMESH_SOL; + else IDX_SOL = ADJFLOW_SOL; + break; + case DISC_ADJ_HEAT: + IDX_SOL = ADJHEAT_SOL; + break; + case DISC_ADJ_FEM: + IDX_SOL = ADJFEA_SOL; + break; + } + + su2double Sensitivity; + for (unsigned long iPoint = 0; iPoint < geometry->GetnPoint(); iPoint++) { + for (unsigned short iDim = 0; iDim < nDim; iDim++) { + + /*--- Current time iteration sensitivity ---*/ + Sensitivity = solvers[IDX_SOL]->GetNodes()->GetSensitivity(iPoint, iDim); + + /*--- Update old sensitivity container ---*/ + solvers[IDX_SOL]->GetNodes()->SetSensitivity_Old(iPoint, iDim, Sensitivity + + solvers[IDX_SOL]->GetNodes()->GetSensitivity_Old(iPoint, iDim)); + + /*--- Update sensitivity ---*/ + solvers[IDX_SOL]->GetNodes()->SetSensitivity( + iPoint, iDim, solvers[IDX_SOL]->GetNodes()->GetSensitivity_Old(iPoint, iDim)); + } + } + } + + // Reset external and solution to end current time run + for (iZone = 0; iZone < nZone; iZone++) { + for (unsigned short iSol=0; iSol < MAX_SOLS; iSol++) { + auto solver = solver_container[iZone][INST_0][MESH_0][iSol]; + if (solver != nullptr) { + solver->GetNodes()->SetExternalZero(); + } + } + Set_Solution_To_BGSSolution_k(iZone); + } } void CDiscAdjMultizoneDriver::EvaluateSensitivities(unsigned long iOuterIter, bool StopCalc) { From 160b6f50eb0d88c5fa2f2fe2a54b641f36b8becf Mon Sep 17 00:00:00 2001 From: cvencro Date: Wed, 19 Feb 2020 19:22:56 +0000 Subject: [PATCH 47/82] missed fixes --- SU2_CFD/include/variables/CFEAVariable.hpp | 12 ++++++++++ SU2_CFD/include/variables/CVariable.hpp | 12 ---------- SU2_CFD/src/SU2_CFD.cpp | 2 +- .../src/drivers/CDiscAdjMultizoneDriver.cpp | 22 +++++++++---------- SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp | 2 +- SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp | 2 +- SU2_CFD/src/solvers/CMeshSolver.cpp | 2 +- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/SU2_CFD/include/variables/CFEAVariable.hpp b/SU2_CFD/include/variables/CFEAVariable.hpp index 3d67900a4356..a81cf74d9d57 100644 --- a/SU2_CFD/include/variables/CFEAVariable.hpp +++ b/SU2_CFD/include/variables/CFEAVariable.hpp @@ -58,6 +58,18 @@ class CFEAVariable : public CVariable { MatrixType Prestretch; /*!< \brief Prestretch geometry */ + su2matrix AD_Vel_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ + su2matrix AD_Vel_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ + + su2matrix AD_Vel_Time_n_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ + su2matrix AD_Vel_Time_n_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ + + su2matrix AD_Accel_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ + su2matrix AD_Accel_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ + + su2matrix AD_Accel_Time_n_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ + su2matrix AD_Accel_Time_n_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ + /*! * \brief Constructor of the class. * \note This class is not supposed to be instantiated, it is only a building block for CFEABoundVariable diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index 4976d3c91818..43199989a710 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -127,18 +127,6 @@ class CVariable { su2matrix AD_Time_n1_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ su2matrix AD_Time_n1_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ - su2matrix AD_Vel_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ - su2matrix AD_Vel_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ - - su2matrix AD_Vel_Time_n_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ - su2matrix AD_Vel_Time_n_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ - - su2matrix AD_Accel_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ - su2matrix AD_Accel_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ - - su2matrix AD_Accel_Time_n_InputIndex; /*!< \brief Indices of Solution variables in the adjoint vector. */ - su2matrix AD_Accel_Time_n_OutputIndex; /*!< \brief Indices of Solution variables in the adjoint vector after having been updated. */ - unsigned long nPoint = {0}; /*!< \brief Number of points in the domain. */ unsigned long nDim = {0}; /*!< \brief Number of dimension of the problem. */ unsigned long nVar = {0}; /*!< \brief Number of variables of the problem. */ diff --git a/SU2_CFD/src/SU2_CFD.cpp b/SU2_CFD/src/SU2_CFD.cpp index 42da3947f29f..b12c718d4849 100644 --- a/SU2_CFD/src/SU2_CFD.cpp +++ b/SU2_CFD/src/SU2_CFD.cpp @@ -132,7 +132,7 @@ int main(int argc, char *argv[]) { } } - else if (multizone && !turbo && !fsi) { + else if (multizone && !turbo) {// && !fsi) { /*--- Generic multizone problems. ---*/ if (disc_adj) { diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index a7e9b64e48ab..e1934d3a3ad5 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -168,6 +168,17 @@ void CDiscAdjMultizoneDriver::Run() { unsigned long nOuterIter = driver_config->GetnOuter_Iter(); bool time_domain = driver_config->GetTime_Domain(); + // Reset external and solution + for (iZone = 0; iZone < nZone; iZone++) { + for (unsigned short iSol=0; iSol < MAX_SOLS; iSol++) { + auto solver = solver_container[iZone][INST_0][MESH_0][iSol]; + if (solver != nullptr) { + solver->GetNodes()->SetExternalZero(); + } + } + Set_Solution_To_BGSSolution_k(iZone); + } + for (iZone = 0; iZone < nZone; iZone++) { if (!time_domain) @@ -378,17 +389,6 @@ void CDiscAdjMultizoneDriver::Run() { } } } - - // Reset external and solution to end current time run - for (iZone = 0; iZone < nZone; iZone++) { - for (unsigned short iSol=0; iSol < MAX_SOLS; iSol++) { - auto solver = solver_container[iZone][INST_0][MESH_0][iSol]; - if (solver != nullptr) { - solver->GetNodes()->SetExternalZero(); - } - } - Set_Solution_To_BGSSolution_k(iZone); - } } void CDiscAdjMultizoneDriver::EvaluateSensitivities(unsigned long iOuterIter, bool StopCalc) { diff --git a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp index 5090d6c4a38f..8be5b9e0ebb5 100644 --- a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp @@ -1061,7 +1061,7 @@ void CDiscAdjFEASolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CC /*--- Set the index manually to zero. ---*/ AD::ResetInput(Coord[iDim]); } - if (!time_domain) { + if (!time_domain || multizone) { nodes->SetSensitivity(iPoint, iDim, Sensitivity); } else { nodes->SetSensitivity(iPoint, iDim, nodes->GetSensitivity(iPoint, iDim) + Sensitivity); diff --git a/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp b/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp index 711f2c42f68f..4092e79a7291 100644 --- a/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp @@ -227,7 +227,7 @@ void CDiscAdjMeshSolver::SetSensitivity(CGeometry *geometry, CSolver **solver, C } /*--- Store the sensitivities ---*/ - if (!time_stepping) { + if (!time_stepping || config->GetMultizone_Problem()) { solver[ADJFLOW_SOL]->GetNodes()->SetSensitivity(iPoint, iDim, Sensitivity); } else { solver[ADJFLOW_SOL]->GetNodes()->SetSensitivity(iPoint, iDim, diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index c465c0a8485b..523f4cc8bdf9 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -742,7 +742,7 @@ void CMeshSolver::Restart_OldGeometry(CGeometry *geometry, CConfig *config) { /*--- Multizone problems require the number of the zone to be appended. ---*/ - if (nZone > 1) + if (config->GetMultizone_Problem()) filename = config->GetMultizone_FileName(filename, iZone, ""); /*--- Determine how many files need to be read. ---*/ From 44c5b8066e8b3cc86f175a98678ae53785cac5ae Mon Sep 17 00:00:00 2001 From: cvencro Date: Sat, 22 Feb 2020 22:50:58 +0000 Subject: [PATCH 48/82] fix for unsteady multizone adjoints with mesh deformation --- .../drivers/CDiscAdjMultizoneDriver.hpp | 2 +- .../src/drivers/CDiscAdjMultizoneDriver.cpp | 32 ++++++++++++++++--- SU2_CFD/src/drivers/CMultizoneDriver.cpp | 2 +- SU2_CFD/src/iteration_structure.cpp | 2 +- SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp | 2 +- 5 files changed, 31 insertions(+), 9 deletions(-) diff --git a/SU2_CFD/include/drivers/CDiscAdjMultizoneDriver.hpp b/SU2_CFD/include/drivers/CDiscAdjMultizoneDriver.hpp index bbda2314d3ce..1548f30d7cb0 100644 --- a/SU2_CFD/include/drivers/CDiscAdjMultizoneDriver.hpp +++ b/SU2_CFD/include/drivers/CDiscAdjMultizoneDriver.hpp @@ -129,7 +129,7 @@ class CDiscAdjMultizoneDriver : public CMultizoneDriver { /*! * \brief Transfer data between zones and update grids when required. */ - void HandleDataTransfer(); + void HandleDataTransfer(unsigned short kind_recording); /*! * \brief Run one direct iteration in a zone. diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index e1934d3a3ad5..5f00ae326692 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -541,7 +541,7 @@ void CDiscAdjMultizoneDriver::SetRecording(unsigned short kind_recording, Kind_T * It is necessary to include data transfer and mesh updates in this section as some functions * computed in one zone depend explicitly on the variables of others through that path. --- */ - HandleDataTransfer(); + HandleDataTransfer(kind_recording); SetObjFunction(kind_recording); @@ -551,7 +551,7 @@ void CDiscAdjMultizoneDriver::SetRecording(unsigned short kind_recording, Kind_T /*--- We do the communication here to not differentiate wrt updated boundary data. ---*/ - HandleDataTransfer(); + HandleDataTransfer(kind_recording); AD::Push_TapePosition(); /// TRANSFER @@ -917,14 +917,14 @@ void CDiscAdjMultizoneDriver::InitializeCrossTerms() { } } -void CDiscAdjMultizoneDriver::HandleDataTransfer() { +void CDiscAdjMultizoneDriver::HandleDataTransfer(unsigned short kind_recording) { unsigned long ExtIter = 0; for(iZone = 0; iZone < nZone; iZone++) { /*--- In principle, the mesh does not need to be updated ---*/ - bool DeformMesh = false; + bool DeformMesh = config_container[iZone]->GetDeform_Mesh(); /*--- Transfer from all the remaining zones ---*/ for (unsigned short jZone = 0; jZone < nZone; jZone++){ @@ -934,7 +934,29 @@ void CDiscAdjMultizoneDriver::HandleDataTransfer() { } } /*--- If a mesh update is required due to the transfer of data ---*/ - if (DeformMesh) DynamicMeshUpdate(iZone, ExtIter); + if (DeformMesh) { + + /*--- Legacy dynamic mesh update - Only if GRID_MOVEMENT = YES ---*/ + if (!config_container[iZone]->GetDeform_Mesh() && (config_container[iZone]->GetGrid_Movement() || config_container[iZone]->GetSurface_Movement(FLUID_STRUCTURE_STATIC))) { + iteration_container[iZone][INST_0]->SetGrid_Movement(geometry_container[iZone][INST_0],surface_movement[iZone], + grid_movement[iZone][INST_0], solver_container[iZone][INST_0], + config_container[iZone], 0, TimeIter); + } + + /*--- New solver - all the other routines in SetGrid_Movement should be adapted to this one ---*/ + /*--- Works if DEFORM_MESH = YES ---*/ + if (config_container[iZone]->GetDeform_Mesh()) { + + unsigned short type_recording = kind_recording; + if (kind_recording == MESH_COORDS) type_recording = MESH_DEFORM; + + iteration_container[iZone][INST_0]->SetMesh_Deformation(geometry_container[iZone][INST_0], + solver_container[iZone][INST_0][MESH_0], + numerics_container[iZone][INST_0][MESH_0], + config_container[ZONE_0], + type_recording); + } + } Has_Deformation(iZone) = DeformMesh; } diff --git a/SU2_CFD/src/drivers/CMultizoneDriver.cpp b/SU2_CFD/src/drivers/CMultizoneDriver.cpp index 7bea93708404..c53187df0808 100644 --- a/SU2_CFD/src/drivers/CMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CMultizoneDriver.cpp @@ -530,7 +530,7 @@ void CMultizoneDriver::DynamicMeshUpdate(unsigned long TimeIter) { void CMultizoneDriver::DynamicMeshUpdate(unsigned short val_iZone, unsigned long TimeIter) { /*--- Legacy dynamic mesh update - Only if GRID_MOVEMENT = YES ---*/ - if (config_container[ZONE_0]->GetGrid_Movement() || config_container[ZONE_0]->GetSurface_Movement(FLUID_STRUCTURE_STATIC)) { + if (!config_container[ZONE_0]->GetDeform_Mesh() && (config_container[ZONE_0]->GetGrid_Movement() || config_container[ZONE_0]->GetSurface_Movement(FLUID_STRUCTURE_STATIC))) { iteration_container[val_iZone][INST_0]->SetGrid_Movement(geometry_container[val_iZone][INST_0],surface_movement[val_iZone], grid_movement[val_iZone][INST_0], solver_container[val_iZone][INST_0], config_container[val_iZone], 0, TimeIter); diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 88dc05f1ed0e..55bfc268ac52 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -383,7 +383,7 @@ void CIteration::SetMesh_Deformation(CGeometry **geometry, /*--- Perform the elasticity mesh movement ---*/ if (config->GetDeform_Mesh()) { - if ((kind_recording != MESH_DEFORM) && !config->GetMultizone_Problem()) { + if ((kind_recording != MESH_DEFORM) && (!config->GetMultizone_Problem() || config->GetSurface_Movement(DEFORMING))) { /*--- In a primal run, AD::TapeActive returns a false ---*/ /*--- In any other recordings, the tape is passive during the deformation ---*/ ActiveTape = AD::TapeActive(); diff --git a/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp b/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp index 4092e79a7291..8fd4bb67a792 100644 --- a/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp @@ -227,7 +227,7 @@ void CDiscAdjMeshSolver::SetSensitivity(CGeometry *geometry, CSolver **solver, C } /*--- Store the sensitivities ---*/ - if (!time_stepping || config->GetMultizone_Problem()) { + if (!time_stepping){//CVC: Multizone logic not needed for deforming gradient. Why not? solver[ADJFLOW_SOL]->GetNodes()->SetSensitivity(iPoint, iDim, Sensitivity); } else { solver[ADJFLOW_SOL]->GetNodes()->SetSensitivity(iPoint, iDim, From 3c8060bcc69372825e78434e7941c47722a7a13d Mon Sep 17 00:00:00 2001 From: cvencro Date: Sat, 22 Feb 2020 23:02:24 +0000 Subject: [PATCH 49/82] Update default if deform mesh is specified in config --- SU2_CFD/src/drivers/CMultizoneDriver.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SU2_CFD/src/drivers/CMultizoneDriver.cpp b/SU2_CFD/src/drivers/CMultizoneDriver.cpp index c53187df0808..449b91a33e6d 100644 --- a/SU2_CFD/src/drivers/CMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CMultizoneDriver.cpp @@ -292,7 +292,8 @@ void CMultizoneDriver::Run_GaussSeidel() { for (iZone = 0; iZone < nZone; iZone++){ /*--- In principle, the mesh does not need to be updated ---*/ - UpdateMesh = 0; + /*--- Default updated if config for zone specifies mesh deformation ---*/ + UpdateMesh = config_container[iZone]->GetDeform_Mesh(); /*--- Set the OuterIter ---*/ config_container[iZone]->SetOuterIter(iOuter_Iter); From 3cbfecdf9308f01038c60d6540709325dd82756a Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 23 Feb 2020 10:53:22 +0000 Subject: [PATCH 50/82] update logic to fix static FSI gradients --- SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp | 2 +- SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index 5f00ae326692..700db529564c 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -924,7 +924,7 @@ void CDiscAdjMultizoneDriver::HandleDataTransfer(unsigned short kind_recording) for(iZone = 0; iZone < nZone; iZone++) { /*--- In principle, the mesh does not need to be updated ---*/ - bool DeformMesh = config_container[iZone]->GetDeform_Mesh(); + bool DeformMesh = (false || (config_container[iZone]->GetDeform_Mesh() && config_container[iZone]->GetSurface_Movement(DEFORMING))); /*--- Transfer from all the remaining zones ---*/ for (unsigned short jZone = 0; jZone < nZone; jZone++){ diff --git a/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp b/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp index 8fd4bb67a792..0d8a03ac004a 100644 --- a/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp @@ -227,7 +227,7 @@ void CDiscAdjMeshSolver::SetSensitivity(CGeometry *geometry, CSolver **solver, C } /*--- Store the sensitivities ---*/ - if (!time_stepping){//CVC: Multizone logic not needed for deforming gradient. Why not? + if (!time_stepping){//CVC: Multizone logic not needed for deforming gradient because sensitivities evaluated only once per outer iteration solver[ADJFLOW_SOL]->GetNodes()->SetSensitivity(iPoint, iDim, Sensitivity); } else { solver[ADJFLOW_SOL]->GetNodes()->SetSensitivity(iPoint, iDim, From 406cc6cff63dcf586fe9fe06ac7226d47692fe24 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 24 Feb 2020 14:56:13 +0000 Subject: [PATCH 51/82] make structural BC's less error prone and fix shape derivative bug --- .../include/variables/CFEABoundVariable.hpp | 13 +------ SU2_CFD/include/variables/CVariable.hpp | 7 +--- SU2_CFD/src/integration_structure.cpp | 10 +---- SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp | 7 ++-- SU2_CFD/src/solvers/CFEASolver.cpp | 39 +++++-------------- SU2_CFD/src/variables/CFEABoundVariable.cpp | 2 + 6 files changed, 19 insertions(+), 59 deletions(-) diff --git a/SU2_CFD/include/variables/CFEABoundVariable.hpp b/SU2_CFD/include/variables/CFEABoundVariable.hpp index 434b371194a9..28e59f9ccb05 100644 --- a/SU2_CFD/include/variables/CFEABoundVariable.hpp +++ b/SU2_CFD/include/variables/CFEABoundVariable.hpp @@ -82,14 +82,6 @@ class CFEABoundVariable final : public CFEAVariable { for (unsigned long iVar = 0; iVar < nVar; iVar++) Residual_Ext_Surf(iPoint,iVar) += val_surfForce[iVar]; } - /*! - * \brief Set surface load of the residual term (for dampers - deletes all the other loads) - */ - inline void Set_SurfaceLoad_Res(unsigned long iPoint, unsigned long iVar, su2double val_surfForce) override { - if (!VertexMap.GetVertexIndex(iPoint)) return; - Residual_Ext_Surf(iPoint,iVar) = val_surfForce; - } - /*! * \brief Get the residual term due to surface load */ @@ -101,10 +93,7 @@ class CFEABoundVariable final : public CFEAVariable { /*! * \brief Clear the surface load residual */ - inline void Clear_SurfaceLoad_Res(unsigned long iPoint) override { - if (!VertexMap.GetVertexIndex(iPoint)) return; - for (unsigned long iVar = 0; iVar < nVar; iVar++) Residual_Ext_Surf(iPoint,iVar) = 0.0; - } + inline void Clear_SurfaceLoad_Res() override; /*! * \brief Store the surface load as the load for the previous time step. diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index 43199989a710..c1ab2f01a1ae 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -1779,11 +1779,6 @@ class CVariable { */ inline virtual void Add_SurfaceLoad_Res(unsigned long iPoint, const su2double *val_surfForce) {} - /*! - * \brief A virtual member. - */ - inline virtual void Set_SurfaceLoad_Res(unsigned long iPoint, unsigned long iVar, su2double val_surfForce) {} - /*! * \brief A virtual member. */ @@ -1792,7 +1787,7 @@ class CVariable { /*! * \brief A virtual member. */ - inline virtual void Clear_SurfaceLoad_Res(unsigned long iPoint) {} + inline virtual void Clear_SurfaceLoad_Res() {} /*! * \brief A virtual member. diff --git a/SU2_CFD/src/integration_structure.cpp b/SU2_CFD/src/integration_structure.cpp index 60301c777090..0cf958b0ccdb 100644 --- a/SU2_CFD/src/integration_structure.cpp +++ b/SU2_CFD/src/integration_structure.cpp @@ -245,20 +245,14 @@ void CIntegration::Space_Integration_FEM(CGeometry *geometry, for (unsigned short iMarker = 0; iMarker < config->GetnMarker_All(); iMarker++) { switch (config->GetMarker_All_KindBC(iMarker)) { - /*--- Some external loads are considered constant over the time step ---*/ - case LOAD_DIR_BOUNDARY: - if (first_iter) - solver->BC_Dir_Load(geometry, numerics[FEA_TERM], config, iMarker); + solver->BC_Dir_Load(geometry, numerics[FEA_TERM], config, iMarker); break; case LOAD_SINE_BOUNDARY: - if (first_iter) - solver->BC_Sine_Load(geometry, numerics[FEA_TERM], config, iMarker); + solver->BC_Sine_Load(geometry, numerics[FEA_TERM], config, iMarker); break; - /*--- Others are not, because they depend on the geometry ---*/ - case LOAD_BOUNDARY: solver->BC_Normal_Load(geometry, numerics[FEA_TERM], config, iMarker); break; diff --git a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp index 8be5b9e0ebb5..479417e8c9f2 100644 --- a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp @@ -480,9 +480,10 @@ void CDiscAdjFEASolver::RegisterVariables(CGeometry *geometry, CConfig *config, EField[iVar] = config->Get_Electric_Field_Mod(iVar); } -// if (fea_dv) { -// for (iVar = 0; iVar < nDV; iVar++) DV_Val[iVar] = config->GetDV_Value(iVar,0); -// } + /*--- Reset index, otherwise messes up other derivatives ---*/ + if (fea_dv) { + for (iVar = 0; iVar < nDV; iVar++) AD::ResetInput(DV_Val[iVar]); + } if (!reset) { bool local_index = config->GetMultizone_Problem(); diff --git a/SU2_CFD/src/solvers/CFEASolver.cpp b/SU2_CFD/src/solvers/CFEASolver.cpp index 15d4dc177dd8..96373fbac223 100644 --- a/SU2_CFD/src/solvers/CFEASolver.cpp +++ b/SU2_CFD/src/solvers/CFEASolver.cpp @@ -792,37 +792,14 @@ void CFEASolver::Preprocessing(CGeometry *geometry, CSolver **solver_container, if (body_forces && initial_calc) Compute_DeadLoad(geometry, numerics, config); - + /*--- Clear the linear system solution. ---*/ SU2_OMP_PARALLEL { - /*--- Clear the linear system solution. ---*/ LinSysSol.SetValZero(); - - /*--- Some external forces may be considered constant over the time step. ---*/ - if (first_iter) { - SU2_OMP_FOR_STAT(omp_chunk_size) - for (auto iPoint = 0ul; iPoint < nPoint; iPoint++) - nodes->Clear_SurfaceLoad_Res(iPoint); - } } - /* - * If we apply nonlinear forces, we need to clear the residual - * on every iteration to avoid adding over previous values. - */ - for (unsigned short iMarker = 0; iMarker < config->GetnMarker_All(); iMarker++){ - switch (config->GetMarker_All_KindBC(iMarker)) { - case LOAD_BOUNDARY: - case DAMPER_BOUNDARY: - /*--- For all the vertices in the marker iMarker. ---*/ - for (auto iVertex = 0ul; iVertex < geometry->nVertex[iMarker]; iVertex++) { - /*--- Retrieve the point ID and clear the residual. ---*/ - auto iPoint = geometry->vertex[iMarker][iVertex]->GetNode(); - nodes->Clear_SurfaceLoad_Res(iPoint); - } - break; - } - } + /*--- Clear external forces. ---*/ + nodes->Clear_SurfaceLoad_Res(); /* * FSI loads (computed upstream) need to be integrated if a nonconservative interpolation scheme is in use @@ -2118,10 +2095,12 @@ void CFEASolver::BC_Damper(CGeometry *geometry, CNumerics *numerics, CConfig *co auto iPoint = geometry->bound[val_marker][iElem]->GetNode(iNode); - for (iVar = 0; iVar < nVar; iVar++){ - su2double dampValue = dampC * nodes->GetSolution_Vel(iPoint, iVar); - nodes->Set_SurfaceLoad_Res(iPoint, iVar, dampValue); - } + su2double force[3] = {0.0}; + + for (iVar = 0; iVar < nVar; iVar++) + force[iVar] = dampC * nodes->GetSolution_Vel(iPoint, iVar); + + nodes->Add_SurfaceLoad_Res(iPoint, force); } } diff --git a/SU2_CFD/src/variables/CFEABoundVariable.cpp b/SU2_CFD/src/variables/CFEABoundVariable.cpp index c1aec8e7d992..55c02be64430 100644 --- a/SU2_CFD/src/variables/CFEABoundVariable.cpp +++ b/SU2_CFD/src/variables/CFEABoundVariable.cpp @@ -68,6 +68,8 @@ void CFEABoundVariable::Set_SurfaceLoad_Res_n() { Residual_Ext_Surf_n = Residual void CFEABoundVariable::Clear_FlowTraction() { FlowTraction.setConstant(0.0); } +void CFEABoundVariable::Clear_SurfaceLoad_Res() { Residual_Ext_Surf.setConstant(0.0); } + void CFEABoundVariable::RegisterFlowTraction() { if (!fsi_analysis) return; for (unsigned long iVertex = 0; iVertex < FlowTraction.rows(); iVertex++) From a817cfc5136c821e7b922b71294cf96974289649 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 24 Feb 2020 16:14:34 +0000 Subject: [PATCH 52/82] add mesh register/extract calls --- .../drivers/CDiscAdjMultizoneDriver.hpp | 2 +- .../src/drivers/CDiscAdjMultizoneDriver.cpp | 30 +++---------------- SU2_CFD/src/iteration_structure.cpp | 18 ++++++++++- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/SU2_CFD/include/drivers/CDiscAdjMultizoneDriver.hpp b/SU2_CFD/include/drivers/CDiscAdjMultizoneDriver.hpp index 1548f30d7cb0..bbda2314d3ce 100644 --- a/SU2_CFD/include/drivers/CDiscAdjMultizoneDriver.hpp +++ b/SU2_CFD/include/drivers/CDiscAdjMultizoneDriver.hpp @@ -129,7 +129,7 @@ class CDiscAdjMultizoneDriver : public CMultizoneDriver { /*! * \brief Transfer data between zones and update grids when required. */ - void HandleDataTransfer(unsigned short kind_recording); + void HandleDataTransfer(); /*! * \brief Run one direct iteration in a zone. diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index 700db529564c..631ab72d6e23 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -541,7 +541,7 @@ void CDiscAdjMultizoneDriver::SetRecording(unsigned short kind_recording, Kind_T * It is necessary to include data transfer and mesh updates in this section as some functions * computed in one zone depend explicitly on the variables of others through that path. --- */ - HandleDataTransfer(kind_recording); + HandleDataTransfer(); SetObjFunction(kind_recording); @@ -551,7 +551,7 @@ void CDiscAdjMultizoneDriver::SetRecording(unsigned short kind_recording, Kind_T /*--- We do the communication here to not differentiate wrt updated boundary data. ---*/ - HandleDataTransfer(kind_recording); + HandleDataTransfer(); AD::Push_TapePosition(); /// TRANSFER @@ -917,7 +917,7 @@ void CDiscAdjMultizoneDriver::InitializeCrossTerms() { } } -void CDiscAdjMultizoneDriver::HandleDataTransfer(unsigned short kind_recording) { +void CDiscAdjMultizoneDriver::HandleDataTransfer() { unsigned long ExtIter = 0; @@ -934,29 +934,7 @@ void CDiscAdjMultizoneDriver::HandleDataTransfer(unsigned short kind_recording) } } /*--- If a mesh update is required due to the transfer of data ---*/ - if (DeformMesh) { - - /*--- Legacy dynamic mesh update - Only if GRID_MOVEMENT = YES ---*/ - if (!config_container[iZone]->GetDeform_Mesh() && (config_container[iZone]->GetGrid_Movement() || config_container[iZone]->GetSurface_Movement(FLUID_STRUCTURE_STATIC))) { - iteration_container[iZone][INST_0]->SetGrid_Movement(geometry_container[iZone][INST_0],surface_movement[iZone], - grid_movement[iZone][INST_0], solver_container[iZone][INST_0], - config_container[iZone], 0, TimeIter); - } - - /*--- New solver - all the other routines in SetGrid_Movement should be adapted to this one ---*/ - /*--- Works if DEFORM_MESH = YES ---*/ - if (config_container[iZone]->GetDeform_Mesh()) { - - unsigned short type_recording = kind_recording; - if (kind_recording == MESH_COORDS) type_recording = MESH_DEFORM; - - iteration_container[iZone][INST_0]->SetMesh_Deformation(geometry_container[iZone][INST_0], - solver_container[iZone][INST_0][MESH_0], - numerics_container[iZone][INST_0][MESH_0], - config_container[ZONE_0], - type_recording); - } - } + if (DeformMesh) DynamicMeshUpdate(iZone, ExtIter); Has_Deformation(iZone) = DeformMesh; } diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 55bfc268ac52..bea7b1677b5d 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -383,7 +383,7 @@ void CIteration::SetMesh_Deformation(CGeometry **geometry, /*--- Perform the elasticity mesh movement ---*/ if (config->GetDeform_Mesh()) { - if ((kind_recording != MESH_DEFORM) && (!config->GetMultizone_Problem() || config->GetSurface_Movement(DEFORMING))) { + if ((kind_recording != MESH_DEFORM) && (!config->GetMultizone_Problem())) { /*--- In a primal run, AD::TapeActive returns a false ---*/ /*--- In any other recordings, the tape is passive during the deformation ---*/ ActiveTape = AD::TapeActive(); @@ -2349,6 +2349,12 @@ void CDiscAdjFluidIteration::Iterate(COutput *output, solver[val_iZone][val_iInst][MESH_0][ADJFLOW_SOL]->ExtractAdjoint_Variables(geometry[val_iZone][val_iInst][MESH_0], config[val_iZone]); + /*--- If mesh deformation defined in config, extract here as well ---*/ + if (config[val_iZone]->GetDeform_Mesh()) { + solver[val_iZone][val_iInst][MESH_0][ADJMESH_SOL]->ExtractAdjoint_Solution(geometry[val_iZone][val_iInst][MESH_0], config[val_iZone]); + + solver[val_iZone][val_iInst][MESH_0][ADJMESH_SOL]->ExtractAdjoint_Variables(geometry[val_iZone][val_iInst][MESH_0], config[val_iZone]); + } } if (turbulent && !frozen_visc) { @@ -2411,6 +2417,16 @@ void CDiscAdjFluidIteration::RegisterInput(CSolver *****solver, CGeometry ****ge solver[iZone][iInst][MESH_0][ADJFLOW_SOL]->RegisterSolution(geometry[iZone][iInst][MESH_0], config[iZone]); solver[iZone][iInst][MESH_0][ADJFLOW_SOL]->RegisterVariables(geometry[iZone][iInst][MESH_0], config[iZone]); + + /*--- If mesh deformation defined in config, register here as well ---*/ + if (config[iZone]->GetDeform_Mesh()) { + + /*--- Undeformed mesh coordinates ---*/ + solver[iZone][iInst][MESH_0][ADJMESH_SOL]->RegisterSolution(geometry[iZone][iInst][MESH_0], config[iZone]); + + /*--- Boundary displacements ---*/ + solver[iZone][iInst][MESH_0][ADJMESH_SOL]->RegisterVariables(geometry[iZone][iInst][MESH_0], config[iZone]); + } } if (turbulent && !frozen_visc) { From 82a7402756fc4c82f051ac9d44d6cdc3803d0fba Mon Sep 17 00:00:00 2001 From: cvencro Date: Tue, 3 Mar 2020 08:44:21 +0000 Subject: [PATCH 53/82] fix and update mass residual calculation --- SU2_CFD/include/integration_structure.hpp | 2 +- SU2_CFD/include/solvers/CFEASolver.hpp | 1 + SU2_CFD/include/solvers/CSolver.hpp | 1 + SU2_CFD/src/integration_structure.cpp | 8 ++++---- SU2_CFD/src/integration_time.cpp | 6 +++--- SU2_CFD/src/solvers/CFEASolver.cpp | 9 ++++----- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/SU2_CFD/include/integration_structure.hpp b/SU2_CFD/include/integration_structure.hpp index 203829c34702..b5d2052e5176 100644 --- a/SU2_CFD/include/integration_structure.hpp +++ b/SU2_CFD/include/integration_structure.hpp @@ -109,7 +109,7 @@ class CIntegration { * \param[in] iRKStep - Current step of the Runge-Kutta iteration. * \param[in] RunTime_EqSystem - System of equations which is going to be solved. */ - void Time_Integration(CGeometry *geometry, CSolver **solver_container, CConfig *config, + void Time_Integration(CGeometry *geometry, CSolver **solver_container, CNumerics **numerics, CConfig *config, unsigned short iRKStep, unsigned short RunTime_EqSystem); /*! diff --git a/SU2_CFD/include/solvers/CFEASolver.hpp b/SU2_CFD/include/solvers/CFEASolver.hpp index 742573eb56d4..7bf120f89085 100644 --- a/SU2_CFD/include/solvers/CFEASolver.hpp +++ b/SU2_CFD/include/solvers/CFEASolver.hpp @@ -461,6 +461,7 @@ class CFEASolver : public CSolver { */ void ImplicitNewmark_Iteration(CGeometry *geometry, CSolver **solver_container, + CNumerics **numerics, CConfig *config) final; /*! diff --git a/SU2_CFD/include/solvers/CSolver.hpp b/SU2_CFD/include/solvers/CSolver.hpp index 308a46d3a0bb..668b745d0a8a 100644 --- a/SU2_CFD/include/solvers/CSolver.hpp +++ b/SU2_CFD/include/solvers/CSolver.hpp @@ -1571,6 +1571,7 @@ class CSolver { */ inline virtual void ImplicitNewmark_Iteration(CGeometry *geometry, CSolver **solver_container, + CNumerics **numerics, CConfig *config) { } /*! diff --git a/SU2_CFD/src/integration_structure.cpp b/SU2_CFD/src/integration_structure.cpp index 0cf958b0ccdb..45157f1c0f42 100644 --- a/SU2_CFD/src/integration_structure.cpp +++ b/SU2_CFD/src/integration_structure.cpp @@ -298,7 +298,7 @@ void CIntegration::Adjoint_Setup(CGeometry ****geometry, CSolver *****solver_con } -void CIntegration::Time_Integration(CGeometry *geometry, CSolver **solver_container, CConfig *config, unsigned short iRKStep, +void CIntegration::Time_Integration(CGeometry *geometry, CSolver **solver_container, CNumerics **numerics, CConfig *config, unsigned short iRKStep, unsigned short RunTime_EqSystem) { unsigned short MainSolver = config->GetContainerPosition(RunTime_EqSystem); unsigned short KindSolver = config->GetKind_Solver(); @@ -334,7 +334,7 @@ void CIntegration::Time_Integration(CGeometry *geometry, CSolver **solver_contai solver_container[MainSolver]->ExplicitRK_Iteration(geometry, solver_container, config, iRKStep); break; case (NEWMARK_IMPLICIT): - solver_container[MainSolver]->ImplicitNewmark_Iteration(geometry, solver_container, config); + solver_container[MainSolver]->ImplicitNewmark_Iteration(geometry, solver_container, numerics, config); break; case (GENERALIZED_ALPHA): solver_container[MainSolver]->ImplicitEuler_Iteration(geometry, solver_container, config); @@ -355,10 +355,10 @@ void CIntegration::Time_Integration_FEM(CGeometry *geometry, CSolver **solver_co switch (config->GetKind_TimeIntScheme_FEA()) { case (CD_EXPLICIT): - solver_container[MainSolver]->ImplicitNewmark_Iteration(geometry, solver_container, config); + solver_container[MainSolver]->ImplicitNewmark_Iteration(geometry, solver_container, numerics, config); break; case (NEWMARK_IMPLICIT): - solver_container[MainSolver]->ImplicitNewmark_Iteration(geometry, solver_container, config); + solver_container[MainSolver]->ImplicitNewmark_Iteration(geometry, solver_container, numerics, config); break; case (GENERALIZED_ALPHA): solver_container[MainSolver]->GeneralizedAlpha_Iteration(geometry, solver_container, config); diff --git a/SU2_CFD/src/integration_time.cpp b/SU2_CFD/src/integration_time.cpp index 40058283a689..5dc00848a8a8 100644 --- a/SU2_CFD/src/integration_time.cpp +++ b/SU2_CFD/src/integration_time.cpp @@ -152,7 +152,7 @@ void CMultiGridIntegration::MultiGrid_Cycle(CGeometry ****geometry, /*--- Time integration, update solution using the old solution plus the solution increment ---*/ - Time_Integration(geometry[iZone][iInst][iMesh], solver_container[iZone][iInst][iMesh], config[iZone], iRKStep, RunTime_EqSystem); + Time_Integration(geometry[iZone][iInst][iMesh], solver_container[iZone][iInst][iMesh], numerics_container[iZone][iInst][iMesh][SolContainer_Position], config[iZone], iRKStep, RunTime_EqSystem); /*--- Send-Receive boundary conditions, and postprocessing ---*/ @@ -216,7 +216,7 @@ void CMultiGridIntegration::MultiGrid_Cycle(CGeometry ****geometry, } Space_Integration(geometry[iZone][iInst][iMesh], solver_container[iZone][iInst][iMesh], numerics_container[iZone][iInst][iMesh][SolContainer_Position], config[iZone], iMesh, iRKStep, RunTime_EqSystem); - Time_Integration(geometry[iZone][iInst][iMesh], solver_container[iZone][iInst][iMesh], config[iZone], iRKStep, RunTime_EqSystem); + Time_Integration(geometry[iZone][iInst][iMesh], solver_container[iZone][iInst][iMesh], numerics_container[iZone][iInst][iMesh][SolContainer_Position], config[iZone], iRKStep, RunTime_EqSystem); solver_container[iZone][iInst][iMesh][SolContainer_Position]->Postprocessing(geometry[iZone][iInst][iMesh], solver_container[iZone][iInst][iMesh], config[iZone], iMesh); @@ -748,7 +748,7 @@ void CSingleGridIntegration::SingleGrid_Iteration(CGeometry ****geometry, CSolve /*--- Time integration ---*/ - Time_Integration(geometry[iZone][iInst][FinestMesh], solver_container[iZone][iInst][FinestMesh], config[iZone], NO_RK_ITER, + Time_Integration(geometry[iZone][iInst][FinestMesh], solver_container[iZone][iInst][FinestMesh], numerics_container[iZone][iInst][iMesh][SolContainer_Position], config[iZone], NO_RK_ITER, RunTime_EqSystem); /*--- Postprocessing ---*/ diff --git a/SU2_CFD/src/solvers/CFEASolver.cpp b/SU2_CFD/src/solvers/CFEASolver.cpp index 96373fbac223..11059f5f29e5 100644 --- a/SU2_CFD/src/solvers/CFEASolver.cpp +++ b/SU2_CFD/src/solvers/CFEASolver.cpp @@ -1216,8 +1216,7 @@ void CFEASolver::Compute_MassRes(CGeometry *geometry, CNumerics **numerics, CCon su2double Mab = simp_penalty * element->Get_Mab(iNode, jNode); for (iVar = 0; iVar < nVar; iVar++) { - TimeRes[indexNode[iNode]*nVar+iVar] += Mab * TimeRes_Aux.GetBlock(indexNode[iNode],iVar); - TimeRes[indexNode[jNode]*nVar+iVar] += Mab * TimeRes_Aux.GetBlock(indexNode[jNode],iVar); + TimeRes[indexNode[iNode]*nVar+iVar] += Mab * TimeRes_Aux.GetBlock(indexNode[jNode],iVar); } } } @@ -1564,7 +1563,7 @@ void CFEASolver::Compute_NodalStress(CGeometry *geometry, CNumerics **numerics, } /*--- Once computed, compute M*TimeRes_Aux ---*/ - MassMatrix.MatrixVectorProduct(TimeRes_Aux,TimeRes,geometry,config); + Compute_MassRes(geometry, numerics, config); /*--- Loop over all the markers ---*/ for (iMarker = 0; iMarker < config->GetnMarker_All(); iMarker++) @@ -2367,7 +2366,7 @@ su2double CFEASolver::Compute_LoadCoefficient(su2double CurrentTime, su2double R } -void CFEASolver::ImplicitNewmark_Iteration(CGeometry *geometry, CSolver **solver_container, CConfig *config) { +void CFEASolver::ImplicitNewmark_Iteration(CGeometry *geometry, CSolver **solver_container, CNumerics **numerics, CConfig *config) { const bool first_iter = (config->GetInnerIter() == 0); const bool dynamic = (config->GetTime_Domain()); @@ -2444,7 +2443,7 @@ void CFEASolver::ImplicitNewmark_Iteration(CGeometry *geometry, CSolver **solver /*--- Add M*TimeRes_Aux to the residual. ---*/ - MassMatrix.MatrixVectorProduct(TimeRes_Aux, TimeRes, geometry, config); + Compute_MassRes(geometry, numerics, config); LinSysRes += TimeRes; } From 2c7512a66826232bb612987fa41c7a9c9b3bf407 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 9 Mar 2020 07:59:32 +0000 Subject: [PATCH 54/82] switch euler wall bc --- SU2_CFD/src/solvers/CEulerSolver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SU2_CFD/src/solvers/CEulerSolver.cpp b/SU2_CFD/src/solvers/CEulerSolver.cpp index 7c7c4f877d5b..7bd675e9fb4d 100644 --- a/SU2_CFD/src/solvers/CEulerSolver.cpp +++ b/SU2_CFD/src/solvers/CEulerSolver.cpp @@ -7323,7 +7323,7 @@ void CEulerSolver::BC_Euler_Wall(CGeometry *geometry, CConfig *config, unsigned short val_marker) { - if (false) { + if (true) { /*--- Call the equivalent symmetry plane boundary condition. ---*/ BC_Sym_Plane(geometry, solver_container, conv_numerics, visc_numerics, config, val_marker); } From 466e7a764e0b7d3ec9e3151de6903eb114037c94 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 15 Mar 2020 21:50:26 +0000 Subject: [PATCH 55/82] set volume nM1 for dynamic grid problems --- SU2_CFD/src/drivers/CDriver.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index 437b983083cb..39aa86bdeb4c 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -929,7 +929,7 @@ void CDriver::Geometrical_Preprocessing_FVM(CConfig *config, CGeometry **&geomet /*--- For unsteady simulations, initialize the grid volumes and coordinates for previous solutions. Loop over all zones/grids ---*/ - if (config->GetTime_Marching() && config->GetGrid_Movement()) { + if (config->GetTime_Marching() && (config->GetDynamic_Grid() || config->GetGrid_Movement())) { for (iMGlevel = 0; iMGlevel <= config->GetnMGLevels(); iMGlevel++) { for (iPoint = 0; iPoint < geometry[iMGlevel]->GetnPoint(); iPoint++) { @@ -939,9 +939,10 @@ void CDriver::Geometrical_Preprocessing_FVM(CConfig *config, CGeometry **&geomet geometry[iMGlevel]->node[iPoint]->SetVolume_nM1(); /*--- Update point coordinates ---*/ - geometry[iMGlevel]->node[iPoint]->SetCoord_n(); - geometry[iMGlevel]->node[iPoint]->SetCoord_n1(); - + if (config->GetGrid_Movement()) { + geometry[iMGlevel]->node[iPoint]->SetCoord_n(); + geometry[iMGlevel]->node[iPoint]->SetCoord_n1(); + } } } } From 355ab765b843d562a231368e195a749d8f3b5614 Mon Sep 17 00:00:00 2001 From: cvencro Date: Wed, 18 Mar 2020 22:26:51 +0000 Subject: [PATCH 56/82] fix iZone iInst order --- SU2_CFD/src/iteration_structure.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index bea7b1677b5d..fd0f1ee2f24e 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -2130,7 +2130,7 @@ void CDiscAdjFluidIteration::Preprocess(COutput *output, /*--- Load solution timestep n ---*/ - LoadUnsteady_Solution(geometry, solver,config, val_iInst, val_iZone, Direct_Iter); + LoadUnsteady_Solution(geometry, solver,config, val_iZone, val_iInst, Direct_Iter); if (config[val_iZone]->GetDeform_Mesh()) { solver[val_iZone][val_iInst][MESH_0][MESH_SOL]->LoadRestart(geometry[val_iZone][val_iInst], solver[val_iZone][val_iInst], config[val_iZone], Direct_Iter, true); @@ -2151,9 +2151,9 @@ void CDiscAdjFluidIteration::Preprocess(COutput *output, /*--- Load solution timestep n-1 | n-2 for DualTimestepping 1st | 2nd order ---*/ if (dual_time_1st){ - LoadUnsteady_Solution(geometry, solver,config, val_iInst, val_iZone, Direct_Iter - 1); + LoadUnsteady_Solution(geometry, solver,config, val_iZone, val_iInst, Direct_Iter - 1); } else { - LoadUnsteady_Solution(geometry, solver,config, val_iInst, val_iZone, Direct_Iter - 2); + LoadUnsteady_Solution(geometry, solver,config, val_iZone, val_iInst, Direct_Iter - 2); } From 5451f43d22f974c3611f29f939c8b955f2667635 Mon Sep 17 00:00:00 2001 From: cvencro Date: Wed, 18 Mar 2020 22:52:13 +0000 Subject: [PATCH 57/82] avoid cross-term adjoint solution in dual-time source terms --- SU2_CFD/include/iteration_structure.hpp | 27 ++++++++----- SU2_CFD/include/solvers/CDiscAdjSolver.hpp | 2 +- SU2_CFD/include/solvers/CSolver.hpp | 1 + .../src/drivers/CDiscAdjMultizoneDriver.cpp | 8 ++-- .../src/drivers/CDiscAdjSinglezoneDriver.cpp | 4 +- SU2_CFD/src/drivers/CDriver.cpp | 12 +++--- SU2_CFD/src/iteration_structure.cpp | 40 +++++++++++-------- SU2_CFD/src/solvers/CDiscAdjSolver.cpp | 6 +-- 8 files changed, 59 insertions(+), 41 deletions(-) diff --git a/SU2_CFD/include/iteration_structure.hpp b/SU2_CFD/include/iteration_structure.hpp index 927cda189f7a..b4c90d2b0ab7 100644 --- a/SU2_CFD/include/iteration_structure.hpp +++ b/SU2_CFD/include/iteration_structure.hpp @@ -142,7 +142,8 @@ class CIteration { CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst); + unsigned short val_iInst, + bool CrossTerm); /*! * \brief A virtual member. @@ -408,7 +409,8 @@ class CFluidIteration : public CIteration { CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst); + unsigned short val_iInst, + bool CrossTerm); /*! * \brief Iterate the fluid system for a number of Inner_Iter iterations. @@ -640,7 +642,8 @@ class CFEMFluidIteration : public CFluidIteration { CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst); + unsigned short val_iInst, + bool CrossTerm); /*! * \brief Updates the containers for the finite element flow system. @@ -734,7 +737,8 @@ class CHeatIteration : public CIteration { CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst); + unsigned short val_iInst, + bool CrossTerm); /*! * \brief Perform a single iteration of the wave system. @@ -864,7 +868,8 @@ class CFEAIteration : public CIteration { CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst); + unsigned short val_iInst, + bool CrossTerm); /*! * \brief Iterate the structural system for a number of Inner_Iter iterations. @@ -1049,7 +1054,8 @@ class CAdjFluidIteration : public CFluidIteration { CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst); + unsigned short val_iInst, + bool CrossTerm); /*! * \brief Updates the containers for the adjoint fluid system. @@ -1148,7 +1154,8 @@ class CDiscAdjFluidIteration : public CIteration { CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst); + unsigned short val_iInst, + bool CrossTerm); /*! @@ -1443,7 +1450,8 @@ class CDiscAdjFEAIteration : public CIteration { CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst); + unsigned short val_iInst, + bool CrossTerm); /*! * \brief Updates the containers for the discrete adjoint mean flow system. @@ -1720,7 +1728,8 @@ class CDiscAdjHeatIteration : public CIteration { CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst); + unsigned short val_iInst, + bool CrossTerm); /*! * \brief Perform a single iteration of the adjoint fluid system. diff --git a/SU2_CFD/include/solvers/CDiscAdjSolver.hpp b/SU2_CFD/include/solvers/CDiscAdjSolver.hpp index 15f4ae06661b..0fb38b4f99c2 100644 --- a/SU2_CFD/include/solvers/CDiscAdjSolver.hpp +++ b/SU2_CFD/include/solvers/CDiscAdjSolver.hpp @@ -129,7 +129,7 @@ class CDiscAdjSolver final : public CSolver { * \param[in] geometry - The geometrical definition of the problem. * \param[in] config - The particular config. */ - void ExtractAdjoint_Solution(CGeometry *geometry, CConfig *config) override; + void ExtractAdjoint_Solution(CGeometry *geometry, CConfig *config, bool CrossTerm) override; /*! * \brief A virtual member. diff --git a/SU2_CFD/include/solvers/CSolver.hpp b/SU2_CFD/include/solvers/CSolver.hpp index 668b745d0a8a..ca65737debd9 100644 --- a/SU2_CFD/include/solvers/CSolver.hpp +++ b/SU2_CFD/include/solvers/CSolver.hpp @@ -3991,6 +3991,7 @@ class CSolver { * \param[in] config - The particular config. */ inline virtual void ExtractAdjoint_Solution(CGeometry *geometry, CConfig *config){} + inline virtual void ExtractAdjoint_Solution(CGeometry *geometry, CConfig *config, bool CrossTerm){} /*! * \brief A virtual member. diff --git a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp index 631ab72d6e23..a6f8d99b1a33 100644 --- a/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjMultizoneDriver.cpp @@ -210,7 +210,7 @@ void CDiscAdjMultizoneDriver::Run() { iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, iZone, INST_0); + surface_movement, grid_movement, FFDBox, iZone, INST_0, false); Add_Solution_To_External(iZone); } @@ -289,7 +289,7 @@ void CDiscAdjMultizoneDriver::Run() { /*--- Extracting adjoints for solvers in iZone w.r.t. to outputs in iZone (diagonal part). ---*/ iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, iZone, INST_0); + surface_movement, grid_movement, FFDBox, iZone, INST_0, false); /*--- Print out the convergence data to screen and history file ---*/ @@ -312,7 +312,7 @@ void CDiscAdjMultizoneDriver::Run() { iteration_container[jZone][INST_0]->Iterate(output_container[jZone], integration_container, geometry_container, solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, jZone, INST_0); + surface_movement, grid_movement, FFDBox, jZone, INST_0, true); /*--- Extract the cross-term performing a relaxed update of it and of the sum (External) for jZone. ---*/ @@ -597,7 +597,7 @@ void CDiscAdjMultizoneDriver::DirectIteration(unsigned short iZone, unsigned sho /*--- Iterate the zone as a block a single time ---*/ direct_iteration[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, iZone, INST_0); + surface_movement, grid_movement, FFDBox, iZone, INST_0, false); /*--- Print residuals in the first iteration ---*/ diff --git a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp index 5467f101c6c1..89534419fe50 100644 --- a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp @@ -167,7 +167,7 @@ void CDiscAdjSinglezoneDriver::Run() { iteration->Iterate(output_container[ZONE_0], integration_container, geometry_container, solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, ZONE_0, INST_0); + surface_movement, grid_movement, FFDBox, ZONE_0, INST_0, false); /*--- Monitor the pseudo-time ---*/ @@ -406,7 +406,7 @@ void CDiscAdjSinglezoneDriver::DirectRun(unsigned short kind_recording){ /*--- Iterate the direct solver ---*/ - direct_iteration->Iterate(direct_output, integration_container, geometry_container, solver_container, numerics_container, config_container, surface_movement, grid_movement, FFDBox, ZONE_0, INST_0); + direct_iteration->Iterate(direct_output, integration_container, geometry_container, solver_container, numerics_container, config_container, surface_movement, grid_movement, FFDBox, ZONE_0, INST_0, false); /*--- Postprocess the direct solver ---*/ diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index 39aa86bdeb4c..2607625f56c0 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -3674,7 +3674,7 @@ void CFluidDriver::Run() { for (iZone = 0; iZone < nZone; iZone++) { config_container[iZone]->SetInnerIter(IntIter); - iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, solver_container, numerics_container, config_container, surface_movement, grid_movement, FFDBox, iZone, INST_0); + iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, solver_container, numerics_container, config_container, surface_movement, grid_movement, FFDBox, iZone, INST_0, false); } /*--- Check convergence in each zone --*/ @@ -3845,7 +3845,7 @@ void CTurbomachineryDriver::Run() { for (iZone = 0; iZone < nZone; iZone++) { iteration_container[iZone][INST_0]->Iterate(output_container[iZone], integration_container, geometry_container, solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, iZone, INST_0); + surface_movement, grid_movement, FFDBox, iZone, INST_0, false); } for (iZone = 0; iZone < nZone; iZone++) { @@ -4087,7 +4087,7 @@ void CHBDriver::Run() { for (iInst = 0; iInst < nInstHB; iInst++) iteration_container[ZONE_0][iInst]->Iterate(output_container[ZONE_0], integration_container, geometry_container, solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, ZONE_0, iInst); + surface_movement, grid_movement, FFDBox, ZONE_0, iInst, false); /*--- Update the convergence history file (serial and parallel computations). ---*/ @@ -5363,7 +5363,7 @@ void CDiscAdjFSIDriver::Fluid_Iteration_Direct(unsigned short ZONE_FLOW, unsigne direct_iteration[ZONE_FLOW]->Iterate(output_container[ZONE_FLOW], integration_container, geometry_container, solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, ZONE_FLOW, INST_0); + surface_movement, grid_movement, FFDBox, ZONE_FLOW, INST_0, false); /*-----------------------------------------------------------------*/ /*--------------------- Set MPI Solution --------------------------*/ @@ -5414,7 +5414,7 @@ void CDiscAdjFSIDriver::Structural_Iteration_Direct(unsigned short ZONE_FLOW, un direct_iteration[ZONE_STRUCT]->Iterate(output_container[ZONE_STRUCT], integration_container, geometry_container, solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, ZONE_STRUCT, INST_0); + surface_movement, grid_movement, FFDBox, ZONE_STRUCT, INST_0, false); /*-----------------------------------------------------------------*/ /*--------------------- Set MPI Solution --------------------------*/ @@ -5834,7 +5834,7 @@ void CDiscAdjFSIDriver::ExtractAdjoint(unsigned short ZONE_FLOW, /*--- Extract the adjoints of the conservative input variables and store them for the next iteration ---*/ solver_container[ZONE_FLOW][INST_0][MESH_0][ADJFLOW_SOL]->ExtractAdjoint_Solution(geometry_container[ZONE_FLOW][INST_0][MESH_0], - config_container[ZONE_FLOW]); + config_container[ZONE_FLOW], false); solver_container[ZONE_FLOW][INST_0][MESH_0][ADJFLOW_SOL]->ExtractAdjoint_Variables(geometry_container[ZONE_FLOW][INST_0][MESH_0], config_container[ZONE_FLOW]); diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index fd0f1ee2f24e..c08e7e34cb14 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -429,7 +429,8 @@ void CIteration::Iterate(COutput *output, CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst) { } + unsigned short val_iInst, + bool CrossTerm) { } void CIteration::Solve(COutput *output, CIntegration ****integration, CGeometry ****geometry, @@ -562,7 +563,8 @@ void CFluidIteration::Iterate(COutput *output, CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst) { + unsigned short val_iInst, + bool CrossTerm) { unsigned long InnerIter, TimeIter; bool unsteady = (config[val_iZone]->GetTime_Marching() == DT_STEPPING_1ST) || (config[val_iZone]->GetTime_Marching() == DT_STEPPING_2ND); @@ -822,7 +824,7 @@ void CFluidIteration::Solve(COutput *output, /*--- Run a single iteration of the solver ---*/ Iterate(output, integration, geometry, solver, numerics, config, - surface_movement, grid_movement, FFDBox, val_iZone, INST_0); + surface_movement, grid_movement, FFDBox, val_iZone, INST_0, false); /*--- Monitor the pseudo-time ---*/ StopCalc = Monitor(output, integration, geometry, solver, numerics, config, @@ -1176,7 +1178,8 @@ void CFEMFluidIteration::Iterate(COutput *output, CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst) { + unsigned short val_iInst, + bool CrossTerm) { /*--- Update global parameters ---*/ @@ -1253,7 +1256,8 @@ void CHeatIteration::Iterate(COutput *output, CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst) { + unsigned short val_iInst, + bool CrossTerm) { /*--- Update global parameters ---*/ @@ -1347,7 +1351,7 @@ void CHeatIteration::Solve(COutput *output, Iterate(output, integration, geometry, solver, numerics, config, - surface_movement, grid_movement, FFDBox, val_iZone, INST_0); + surface_movement, grid_movement, FFDBox, val_iZone, INST_0, false); if (config[val_iZone]->GetMultizone_Problem() || config[val_iZone]->GetSinglezone_Driver()){ output->SetHistory_Output(geometry[val_iZone][INST_0][MESH_0], solver[val_iZone][INST_0][MESH_0], config[val_iZone], config[val_iZone]->GetTimeIter(), config[val_iZone]->GetOuterIter(), Inner_Iter); @@ -1391,8 +1395,8 @@ void CFEAIteration::Iterate(COutput *output, CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst - ) { + unsigned short val_iInst, + bool CrossTerm) { su2double loadIncrement; unsigned long IntIter = 0; @@ -1821,7 +1825,7 @@ void CFEAIteration::Solve(COutput *output, /*------------------ Structural subiteration ----------------------*/ Iterate(output, integration, geometry, solver, numerics, config, - surface_movement, grid_movement, FFDBox, val_iZone, INST_0); + surface_movement, grid_movement, FFDBox, val_iZone, INST_0, false); /*--- Write the convergence history for the structure (only screen output) ---*/ @@ -1954,7 +1958,8 @@ void CAdjFluidIteration::Iterate(COutput *output, CVolumetricMovement ***grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst) { + unsigned short val_iInst, + bool CrossTerm) { switch( config[val_iZone]->GetKind_Solver() ) { @@ -2333,7 +2338,8 @@ void CDiscAdjFluidIteration::Iterate(COutput *output, CVolumetricMovement ***volume_grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst) { + unsigned short val_iInst, + bool CrossTerm) { unsigned short Kind_Solver = config[val_iZone]->GetKind_Solver(); bool frozen_visc = config[val_iZone]->GetFrozen_Visc_Disc(); @@ -2345,7 +2351,7 @@ void CDiscAdjFluidIteration::Iterate(COutput *output, if ((Kind_Solver == DISC_ADJ_NAVIER_STOKES) || (Kind_Solver == DISC_ADJ_RANS) || (Kind_Solver == DISC_ADJ_EULER) || (Kind_Solver == DISC_ADJ_INC_NAVIER_STOKES) || (Kind_Solver == DISC_ADJ_INC_RANS) || (Kind_Solver == DISC_ADJ_INC_EULER)) { - solver[val_iZone][val_iInst][MESH_0][ADJFLOW_SOL]->ExtractAdjoint_Solution(geometry[val_iZone][val_iInst][MESH_0], config[val_iZone]); + solver[val_iZone][val_iInst][MESH_0][ADJFLOW_SOL]->ExtractAdjoint_Solution(geometry[val_iZone][val_iInst][MESH_0], config[val_iZone], CrossTerm); solver[val_iZone][val_iInst][MESH_0][ADJFLOW_SOL]->ExtractAdjoint_Variables(geometry[val_iZone][val_iInst][MESH_0], config[val_iZone]); @@ -2817,7 +2823,8 @@ void CDiscAdjFEAIteration::Iterate(COutput *output, CVolumetricMovement ***volume_grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst) { + unsigned short val_iInst, + bool CrossTerm) { bool dynamic = (config[val_iZone]->GetTime_Domain()); @@ -2874,7 +2881,7 @@ void CDiscAdjFEAIteration::SetRecording(COutput *output, /*--- Run one iteration while tape is passive - this clears all indices ---*/ fem_iteration->Iterate(output,integration,geometry,solver,numerics, - config,surface_movement,grid_movement,FFDBox,val_iZone, val_iInst); + config,surface_movement,grid_movement,FFDBox,val_iZone, val_iInst, false); } @@ -2903,7 +2910,7 @@ void CDiscAdjFEAIteration::SetRecording(COutput *output, /*--- Run the direct iteration ---*/ fem_iteration->Iterate(output,integration,geometry,solver,numerics, - config,surface_movement,grid_movement,FFDBox, val_iZone, val_iInst); + config,surface_movement,grid_movement,FFDBox, val_iZone, val_iInst, false); config[val_iZone]->SetTimeIter(TimeIter); @@ -3457,7 +3464,8 @@ void CDiscAdjHeatIteration::Iterate(COutput *output, CVolumetricMovement ***volume_grid_movement, CFreeFormDefBox*** FFDBox, unsigned short val_iZone, - unsigned short val_iInst) { + unsigned short val_iInst, + bool CrossTerm) { solver[val_iZone][val_iInst][MESH_0][ADJHEAT_SOL]->ExtractAdjoint_Solution(geometry[val_iZone][val_iInst][MESH_0], diff --git a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp index 3c1119ce7b1e..9ad377cdba20 100644 --- a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp @@ -446,7 +446,7 @@ void CDiscAdjSolver::SetAdj_ObjFunc(CGeometry *geometry, CConfig *config) { } } -void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *config){ +void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *config, bool CrossTerm){ bool time_n1_needed = config->GetTime_Marching() == DT_STEPPING_2ND; bool time_n_needed = (config->GetTime_Marching() == DT_STEPPING_1ST) || time_n1_needed; @@ -503,7 +503,7 @@ if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_tim if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n[1] = " << Solution[1] << endl; if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n[2] = " << Solution[2] << endl; if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n[3] = " << Solution[3] << endl; - nodes->Set_Solution_time_n(iPoint,Solution); + if (!CrossTerm) nodes->Set_Solution_time_n(iPoint,Solution); } } if (time_n1_needed) { @@ -523,7 +523,7 @@ if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_tim if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n1[1] = " << Solution[1] << endl; if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n1[2] = " << Solution[2] << endl; if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n1[3] = " << Solution[3] << endl; - nodes->Set_Solution_time_n1(iPoint,Solution); + if (!CrossTerm) nodes->Set_Solution_time_n1(iPoint,Solution); } } From 0d5c1aa76c438369864f5302d5270429a3a9dbd1 Mon Sep 17 00:00:00 2001 From: cvencro Date: Wed, 6 May 2020 18:21:11 +0100 Subject: [PATCH 58/82] clean up --- SU2_CFD/src/iteration_structure.cpp | 10 +--------- SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp | 2 ++ SU2_CFD/src/solvers/CFEASolver.cpp | 3 --- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index e54eacd4ba17..6cd2cb22539f 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -2618,7 +2618,7 @@ void CDiscAdjFEAIteration::SetRecording(CSolver *****solver, void CDiscAdjFEAIteration::RegisterInput(CSolver *****solver, CGeometry ****geometry, CConfig **config, unsigned short iZone, unsigned short iInst, unsigned short kind_recording){ - if(kind_recording != MESH_COORDS && kind_recording != MESH_DEFORM) { + if(kind_recording != MESH_COORDS) { /*--- Register structural displacements as input ---*/ @@ -2637,14 +2637,6 @@ void CDiscAdjFEAIteration::RegisterInput(CSolver *****solver, CGeometry ****geom geometry[iZone][iInst][MESH_0]->RegisterCoordinates(config[iZone]); } - else if (kind_recording == MESH_DEFORM) { - - /*--- Undeformed mesh coordinates ---*/ - solver[iZone][iInst][MESH_0][ADJMESH_SOL]->RegisterSolution(geometry[iZone][iInst][MESH_0], config[iZone]); - - /*--- Boundary displacements ---*/ - solver[iZone][iInst][MESH_0][ADJMESH_SOL]->RegisterVariables(geometry[iZone][iInst][MESH_0], config[iZone]); - } } void CDiscAdjFEAIteration::SetDependencies(CSolver *****solver, CGeometry ****geometry, CNumerics ******numerics, CConfig **config, diff --git a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp index 06305961e4af..7ed3072e23b7 100644 --- a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp @@ -906,8 +906,10 @@ void CDiscAdjFEASolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CC AD::ResetInput(Coord[iDim]); } if (!time_domain || multizone) { + if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: SetSensitivity[" << iDim << "] = " << Sensitivity << " (Current only)" << endl; nodes->SetSensitivity(iPoint, iDim, Sensitivity); } else { + if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: SetSensitivity[" << iDim << "] = " << Sensitivity << " (Adding previous = " << nodes->GetSensitivity(iPoint, iDim) << ")" << endl; nodes->SetSensitivity(iPoint, iDim, nodes->GetSensitivity(iPoint, iDim) + Sensitivity); } } diff --git a/SU2_CFD/src/solvers/CFEASolver.cpp b/SU2_CFD/src/solvers/CFEASolver.cpp index aaf00304577a..511cb272b9d5 100644 --- a/SU2_CFD/src/solvers/CFEASolver.cpp +++ b/SU2_CFD/src/solvers/CFEASolver.cpp @@ -3371,11 +3371,8 @@ void CFEASolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig *c for (unsigned short iVar = 0; iVar < nVar; iVar++) { nodes->SetSolution(iPoint_Local, iVar, Sol[iVar]); if (dynamic) { - nodes->Set_Solution_time_n(iPoint_Local, iVar, Sol[iVar]); nodes->SetSolution_Vel(iPoint_Local, iVar, Sol[iVar+nVar]); - nodes->SetSolution_Vel_time_n(iPoint_Local, iVar, Sol[iVar+nVar]); nodes->SetSolution_Accel(iPoint_Local, iVar, Sol[iVar+2*nVar]); - nodes->SetSolution_Accel_time_n(iPoint_Local, iVar, Sol[iVar+2*nVar]); } if (fluid_structure && !dynamic) { nodes->SetSolution_Pred(iPoint_Local, iVar, Sol[iVar]); From a0f34503ed07a9fc260dc8c3333ee8954ca994bc Mon Sep 17 00:00:00 2001 From: cvencro Date: Thu, 7 May 2020 12:37:09 +0100 Subject: [PATCH 59/82] remove debug comments, duplicated code, general clean-up --- Common/src/CConfig.cpp | 8 --- SU2_CFD/include/solvers/CSolver.hpp | 8 --- .../src/drivers/CDiscAdjSinglezoneDriver.cpp | 2 +- SU2_CFD/src/iteration_structure.cpp | 9 +-- SU2_CFD/src/output/CFlowCompOutput.cpp | 3 +- SU2_CFD/src/output/CFlowIncOutput.cpp | 3 +- SU2_CFD/src/output/COutput.cpp | 2 - SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp | 56 +++---------------- SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp | 2 +- SU2_CFD/src/solvers/CDiscAdjSolver.cpp | 21 +------ SU2_DOT/src/SU2_DOT.cpp | 1 - 11 files changed, 16 insertions(+), 99 deletions(-) diff --git a/Common/src/CConfig.cpp b/Common/src/CConfig.cpp index 6409374a9359..17fa519acef0 100644 --- a/Common/src/CConfig.cpp +++ b/Common/src/CConfig.cpp @@ -4769,12 +4769,6 @@ void CConfig::SetPostprocessing(unsigned short val_software, unsigned short val_ Restart_Flow = false; - /*if (GetKind_GridMovement() != RIGID_MOTION && - GetKind_GridMovement() != NO_MOVEMENT) { - SU2_MPI::Error(string("Dynamic mesh movement currently only supported for the discrete adjoint solver for\n") + - string("GRID_MOVEMENT = RIGID_MOTION."), CURRENT_FUNCTION); - }*/ - if (Unst_AdjointIter- long(nTimeIter) < 0){ SU2_MPI::Error(string("Invalid iteration number requested for unsteady adjoint.\n" ) + string("Make sure EXT_ITER is larger or equal than UNST_ADJOINT_ITER."), @@ -9651,7 +9645,6 @@ void CConfig::SetMultizone(CConfig *driver_config, CConfig **config_container){ unsigned short iZone = 0; /*--- If there is at least a fluid and a structural zone ---*/ - if (nZone > 1) { for (iZone = 0; iZone < nZone; iZone++){ switch (config_container[iZone]->GetKind_Solver()) { case EULER: case NAVIER_STOKES: case RANS: @@ -9664,7 +9657,6 @@ void CConfig::SetMultizone(CConfig *driver_config, CConfig **config_container){ break; } } - } /*--- If the problem has FSI properties ---*/ FSI_Problem = fluid_zone && structural_zone; diff --git a/SU2_CFD/include/solvers/CSolver.hpp b/SU2_CFD/include/solvers/CSolver.hpp index 91c854f5213e..ad464960e93c 100644 --- a/SU2_CFD/include/solvers/CSolver.hpp +++ b/SU2_CFD/include/solvers/CSolver.hpp @@ -4485,14 +4485,6 @@ class CSolver { CNumerics **numerics, CConfig *config) { } - inline virtual void Surface_Pitching(CGeometry *geometry, CConfig *config, unsigned long iter, unsigned short iZone) { } - - inline virtual void Surface_Rotating(CGeometry *geometry, CConfig *config, unsigned long iter, unsigned short iZone) { } - - inline virtual void Surface_Plunging(CGeometry *geometry, CConfig *config, unsigned long iter, unsigned short iZone) { } - - inline virtual void Surface_Translating(CGeometry *geometry, CConfig *config, unsigned long iter, unsigned short iZone) { } - /*! * \brief A virtual member. * \param[in] geometry - Geometrical definition. diff --git a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp index 3d078d02f8f8..0eea7ad8d453 100644 --- a/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp +++ b/SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp @@ -392,7 +392,7 @@ void CDiscAdjSinglezoneDriver::SetObjFunction(){ break; } - if (rank == MASTER_NODE) { + if (rank == MASTER_NODE){ AD::RegisterOutput(ObjFunc); } diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index f52183a9b544..b885a62af8c6 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -2599,13 +2599,6 @@ void CDiscAdjFEAIteration::SetRecording(CSolver *****solver, unsigned short val_iInst, unsigned short kind_recording) { - /*--- Set correct time iteration for recording if dynamic simulation ---*/ - - if (config[val_iZone]->GetTime_Domain()) { - unsigned long TimeIter = config[val_iZone]->GetTimeIter(); - config[val_iZone]->SetTimeIter(TimeIter); - } - /*--- Prepare for recording by resetting the solution to the initial converged solution ---*/ solver[val_iZone][val_iInst][MESH_0][ADJFEA_SOL]->SetRecording(geometry[val_iZone][val_iInst][MESH_0], config[val_iZone]); @@ -2624,7 +2617,7 @@ void CDiscAdjFEAIteration::RegisterInput(CSolver *****solver, CGeometry ****geom solver[iZone][iInst][MESH_0][ADJFEA_SOL]->RegisterVariables(geometry[iZone][iInst][MESH_0], config[iZone]); } - else if (kind_recording == MESH_COORDS) { + else { /*--- Register topology optimization densities (note direct solver) ---*/ solver[iZone][iInst][MESH_0][FEA_SOL]->RegisterVariables(geometry[iZone][iInst][MESH_0], config[iZone]); diff --git a/SU2_CFD/src/output/CFlowCompOutput.cpp b/SU2_CFD/src/output/CFlowCompOutput.cpp index 2bd42d1d339e..1244c9a12818 100644 --- a/SU2_CFD/src/output/CFlowCompOutput.cpp +++ b/SU2_CFD/src/output/CFlowCompOutput.cpp @@ -57,9 +57,8 @@ CFlowCompOutput::CFlowCompOutput(CConfig *config, unsigned short nDim) : CFlowOu if (nRequestedVolumeFields == 0){ requestedVolumeFields.emplace_back("COORDINATES"); requestedVolumeFields.emplace_back("SOLUTION"); - if (gridMovement) requestedVolumeFields.emplace_back("GRID_VELOCITY"); requestedVolumeFields.emplace_back("PRIMITIVE"); - if (config->GetGrid_Movement()) requestedVolumeFields.emplace_back("GRID_VELOCITY"); + if (gridMovement) requestedVolumeFields.emplace_back("GRID_VELOCITY"); nRequestedVolumeFields = requestedVolumeFields.size(); } diff --git a/SU2_CFD/src/output/CFlowIncOutput.cpp b/SU2_CFD/src/output/CFlowIncOutput.cpp index 808677627598..4a95db313001 100644 --- a/SU2_CFD/src/output/CFlowIncOutput.cpp +++ b/SU2_CFD/src/output/CFlowIncOutput.cpp @@ -59,9 +59,8 @@ CFlowIncOutput::CFlowIncOutput(CConfig *config, unsigned short nDim) : CFlowOutp if (nRequestedVolumeFields == 0){ requestedVolumeFields.emplace_back("COORDINATES"); requestedVolumeFields.emplace_back("SOLUTION"); - if (gridMovement) requestedVolumeFields.emplace_back("GRID_VELOCITY"); requestedVolumeFields.emplace_back("PRIMITIVE"); - if (config->GetGrid_Movement()) requestedVolumeFields.emplace_back("GRID_VELOCITY"); + if (gridMovement) requestedVolumeFields.emplace_back("GRID_VELOCITY"); nRequestedVolumeFields = requestedVolumeFields.size(); } diff --git a/SU2_CFD/src/output/COutput.cpp b/SU2_CFD/src/output/COutput.cpp index 9886cfee33a0..a5030d0c6784 100644 --- a/SU2_CFD/src/output/COutput.cpp +++ b/SU2_CFD/src/output/COutput.cpp @@ -749,8 +749,6 @@ void COutput::WriteToFile(CConfig *config, CGeometry *geometry, unsigned short f bool COutput::SetResult_Files(CGeometry *geometry, CConfig *config, CSolver** solver_container, unsigned long iter, bool force_writing){ - if (curTimeIter != iter) curTimeIter = iter; //CVC: Temp to fix incorrect time iteration number with legacy driver - bool writeFiles = WriteVolume_Output(config, iter, force_writing); /*--- Check if the data sorters are allocated, if not, allocate them. --- */ diff --git a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp index 12268564cb79..a53178dc7f24 100644 --- a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp @@ -349,10 +349,10 @@ void CDiscAdjFEASolver::RegisterSolution(CGeometry *geometry, CConfig *config){ if (dynamic) { /*--- Register acceleration (u'') and velocity (u') at time step n ---*/ - + direct_solver->GetNodes()->RegisterSolution_Accel(input, push_index); direct_solver->GetNodes()->RegisterSolution_Vel(input, push_index); - + /*--- Register solution (u), acceleration (u'') and velocity (u') at time step n-1 ---*/ direct_solver->GetNodes()->Register_femSolution_time_n(input, push_index); direct_solver->GetNodes()->RegisterSolution_Accel_time_n(input, push_index); @@ -430,9 +430,6 @@ void CDiscAdjFEASolver::RegisterVariables(CGeometry *geometry, CConfig *config, } } - /*--- Register coordinates ---*/ - geometry->RegisterCoordinates(config); - /*--- Register the flow tractions ---*/ if (config->GetnMarker_Fluid_Load() > 0) direct_solver->GetNodes()->RegisterFlowTraction(); @@ -558,8 +555,7 @@ void CDiscAdjFEASolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *co } /*--- Store the adjoint solution ---*/ -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[0] = " << Solution[0] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[1] = " << Solution[1] << endl; + nodes->SetSolution(iPoint,Solution); } @@ -585,8 +581,7 @@ if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[1] } /*--- Store the adjoint acceleration solution u'' ---*/ -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Accel[0] = " << Solution_Accel[0] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Accel[1] = " << Solution_Accel[1] << endl; + nodes->SetSolution_Accel(iPoint,Solution_Accel); } @@ -607,8 +602,7 @@ if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Acc } /*--- Store the adjoint velocity solution u'' ---*/ -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Vel[0] = " << Solution_Vel[0] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Vel[1] = " << Solution_Vel[1] << endl; + nodes->SetSolution_Vel(iPoint,Solution_Vel); } @@ -625,8 +619,7 @@ if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Vel } /*--- Store the adjoint solution at time n ---*/ -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_n[0] = " << Solution[0] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_n[1] = " << Solution[1] << endl; + nodes->Set_Solution_time_n(iPoint,Solution); } @@ -642,8 +635,7 @@ if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_n[1 } /*--- Store the adjoint acceleration solution u'' at time n---*/ -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Accel_n[0] = " << Solution_Accel[0] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Accel_n[1] = " << Solution_Accel[1] << endl; + nodes->SetSolution_Accel_time_n(iPoint,Solution_Accel); } @@ -660,8 +652,7 @@ if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Acc } /*--- Store the adjoint velocity solution u' at time n ---*/ -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Vel_n[0] = " << Solution_Vel[0] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_Vel_n[1] = " << Solution_Vel[1] << endl; + nodes->SetSolution_Vel_time_n(iPoint,Solution_Vel); } @@ -747,35 +738,6 @@ void CDiscAdjFEASolver::ExtractAdjoint_Variables(CGeometry *geometry, CConfig *c SU2_MPI::Allreduce(Local_Sens_DV, Global_Sens_DV, nDV, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); } - /*--- Extract the geometric sensitivities ---*/ - - for (unsigned long iPoint = 0; iPoint < nPoint; iPoint++) { - - su2double *Coord = geometry->node[iPoint]->GetCoord(); - - for (unsigned short iDim = 0; iDim < nDim; iDim++) { - - su2double Sensitivity; - - if(config->GetMultizone_Problem()) { - Sensitivity = geometry->node[iPoint]->GetAdjointSolution(iDim); - } - else { - Sensitivity = SU2_TYPE::GetDerivative(Coord[iDim]); - /*--- Set the index manually to zero. ---*/ - AD::ResetInput(Coord[iDim]); - } - if (!config->GetTime_Domain() || config->GetMultizone_Problem()) { - if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Sensitivity[" << iDim << "] = " << Sensitivity << " (Current only)" << endl; - nodes->SetSensitivity(iPoint, iDim, Sensitivity); - } else { - if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Sensitivity[" << iDim << "] = " << Sensitivity << " (Adding previous = " << nodes->GetSensitivity(iPoint, iDim) << ")" << endl; - nodes->SetSensitivity(iPoint, iDim, nodes->GetSensitivity(iPoint, iDim) + Sensitivity); - } - } - } - SetSurface_Sensitivity(geometry, config); - /*--- Extract the flow traction sensitivities ---*/ if (config->GetnMarker_Fluid_Load() > 0){ @@ -904,10 +866,8 @@ void CDiscAdjFEASolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CC AD::ResetInput(Coord[iDim]); } if (!time_domain || multizone) { - if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: SetSensitivity[" << iDim << "] = " << Sensitivity << " (Current only)" << endl; nodes->SetSensitivity(iPoint, iDim, Sensitivity); } else { - if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: SetSensitivity[" << iDim << "] = " << Sensitivity << " (Adding previous = " << nodes->GetSensitivity(iPoint, iDim) << ")" << endl; nodes->SetSensitivity(iPoint, iDim, nodes->GetSensitivity(iPoint, iDim) + Sensitivity); } } diff --git a/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp b/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp index 85650fa03bed..e22b5d9200ed 100644 --- a/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjMeshSolver.cpp @@ -227,7 +227,7 @@ void CDiscAdjMeshSolver::SetSensitivity(CGeometry *geometry, CSolver **solver, C } /*--- Store the sensitivities ---*/ - if (!time_stepping){//CVC: Multizone logic not needed for deforming gradient because sensitivities evaluated only once per outer iteration + if (!time_stepping) { solver[ADJFLOW_SOL]->GetNodes()->SetSensitivity(iPoint, iDim, Sensitivity); } else { solver[ADJFLOW_SOL]->GetNodes()->SetSensitivity(iPoint, iDim, diff --git a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp index 8a2625c0c5a9..99d8551fae66 100644 --- a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp @@ -506,10 +506,6 @@ void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *confi direct_solver->GetNodes()->GetAdjointSolution(iPoint,Solution); } -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[0] = " << Solution[0] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[1] = " << Solution[1] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[2] = " << Solution[2] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[3] = " << Solution[3] << endl; /*--- Relax and store the adjoint solution, compute the residuals. ---*/ for (auto iVar = 0u; iVar < nVar; iVar++) { @@ -537,10 +533,7 @@ if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution[3] } /*--- Store the adjoint solution at time n ---*/ -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n[0] = " << Solution[0] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n[1] = " << Solution[1] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n[2] = " << Solution[2] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n[3] = " << Solution[3] << endl; + if (!CrossTerm) nodes->Set_Solution_time_n(iPoint,Solution); } } @@ -558,10 +551,7 @@ if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_tim } /*--- Store the adjoint solution at time n-1 ---*/ -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n1[0] = " << Solution[0] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n1[1] = " << Solution[1] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n1[2] = " << Solution[2] << endl; -if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Debug: AdjointSolution_time_n1[3] = " << Solution[3] << endl; + if (!CrossTerm) nodes->Set_Solution_time_n1(iPoint,Solution); } } @@ -579,10 +569,7 @@ void CDiscAdjSolver::ExtractAdjoint_Variables(CGeometry *geometry, CConfig *conf Local_Sens_AoA = SU2_TYPE::GetDerivative(Alpha); Local_Sens_Temp = SU2_TYPE::GetDerivative(Temperature); Local_Sens_Press = SU2_TYPE::GetDerivative(Pressure); -if (rank == MASTER_NODE) cout << "CVC: Debug: Local_Sens_Mach = " << Local_Sens_Mach << endl; -if (rank == MASTER_NODE) cout << "CVC: Debug: Local_Sens_AoA = " << Local_Sens_AoA << endl; -if (rank == MASTER_NODE) cout << "CVC: Debug: Local_Sens_Temp = " << Local_Sens_Temp << endl; -if (rank == MASTER_NODE) cout << "CVC: Debug: Local_Sens_Press = " << Local_Sens_Press << endl; + SU2_MPI::Allreduce(&Local_Sens_Mach, &Total_Sens_Mach, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); SU2_MPI::Allreduce(&Local_Sens_AoA, &Total_Sens_AoA, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); SU2_MPI::Allreduce(&Local_Sens_Temp, &Total_Sens_Temp, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); @@ -791,10 +778,8 @@ void CDiscAdjSolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CConf Sensitivity = 0.0; } if (!time_stepping || multizone) { -// if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Sensitivity[" << iDim << "] = " << Sensitivity << " (Current only)" << endl; nodes->SetSensitivity(iPoint,iDim, Sensitivity); } else { -// if (rank == MASTER_NODE && iPoint == 0) cout << "CVC: Sensitivity[" << iDim << "] = " << Sensitivity << " (Adding previous = " << nodes->GetSensitivity(iPoint, iDim) << ")" << endl; nodes->SetSensitivity(iPoint, iDim, nodes->GetSensitivity(iPoint,iDim) + Sensitivity); } } diff --git a/SU2_DOT/src/SU2_DOT.cpp b/SU2_DOT/src/SU2_DOT.cpp index c308d641f5fa..5b3f00380e98 100644 --- a/SU2_DOT/src/SU2_DOT.cpp +++ b/SU2_DOT/src/SU2_DOT.cpp @@ -796,7 +796,6 @@ void SetProjection_AD(CGeometry *geometry, CConfig *config, CSurfaceMovement *su } Gradient[iDV][iDV_Value] += localGradient; - if (rank == MASTER_NODE) cout << "CVC: Debug: SU2_DOT.cpp: SetProjection_AD localGradient["<< iDV << "][" << iDV_Value << "] = " << localGradient << endl; } } From d19fbafedfa8018818de2d73acef8d70d4e712fb Mon Sep 17 00:00:00 2001 From: cvencro Date: Thu, 7 May 2020 14:07:14 +0100 Subject: [PATCH 60/82] register coordinates for all recording --- SU2_CFD/src/iteration_structure.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index b885a62af8c6..7aa4b6083f67 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -2622,10 +2622,11 @@ void CDiscAdjFEAIteration::RegisterInput(CSolver *****solver, CGeometry ****geom solver[iZone][iInst][MESH_0][FEA_SOL]->RegisterVariables(geometry[iZone][iInst][MESH_0], config[iZone]); - /*--- Register mesh coordinates for geometric sensitivities ---*/ - - geometry[iZone][iInst][MESH_0]->RegisterCoordinates(config[iZone]); } + + /*--- Register mesh coordinates for geometric sensitivities ---*/ + + geometry[iZone][iInst][MESH_0]->RegisterCoordinates(config[iZone]); } void CDiscAdjFEAIteration::SetDependencies(CSolver *****solver, CGeometry ****geometry, CNumerics ******numerics, CConfig **config, From c6440d260fc1283a97093d7c8278bf9e6b1e2e44 Mon Sep 17 00:00:00 2001 From: cvencro Date: Fri, 8 May 2020 11:21:54 +0100 Subject: [PATCH 61/82] test fixes for reg tests --- SU2_CFD/src/drivers/CDriver.cpp | 9 ++++----- SU2_CFD/src/solvers/CFEASolver.cpp | 3 +++ SU2_CFD/src/solvers/CMeshSolver.cpp | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index 378a2eea205a..5c78783516ec 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -912,7 +912,7 @@ void CDriver::Geometrical_Preprocessing_FVM(CConfig *config, CGeometry **&geomet /*--- For unsteady simulations, initialize the grid volumes and coordinates for previous solutions. Loop over all zones/grids ---*/ - if (config->GetTime_Marching() && (config->GetDynamic_Grid() || config->GetGrid_Movement())) { + if (config->GetTime_Marching() && config->GetGrid_Movement()) { for (iMGlevel = 0; iMGlevel <= config->GetnMGLevels(); iMGlevel++) { for (iPoint = 0; iPoint < geometry[iMGlevel]->GetnPoint(); iPoint++) { @@ -922,10 +922,9 @@ void CDriver::Geometrical_Preprocessing_FVM(CConfig *config, CGeometry **&geomet geometry[iMGlevel]->node[iPoint]->SetVolume_nM1(); /*--- Update point coordinates ---*/ - if (config->GetGrid_Movement()) { - geometry[iMGlevel]->node[iPoint]->SetCoord_n(); - geometry[iMGlevel]->node[iPoint]->SetCoord_n1(); - } + geometry[iMGlevel]->node[iPoint]->SetCoord_n(); + geometry[iMGlevel]->node[iPoint]->SetCoord_n1(); + } } } diff --git a/SU2_CFD/src/solvers/CFEASolver.cpp b/SU2_CFD/src/solvers/CFEASolver.cpp index 73bda1138cef..ce00b59556ab 100644 --- a/SU2_CFD/src/solvers/CFEASolver.cpp +++ b/SU2_CFD/src/solvers/CFEASolver.cpp @@ -3363,8 +3363,11 @@ void CFEASolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig *c for (unsigned short iVar = 0; iVar < nVar; iVar++) { nodes->SetSolution(iPoint_Local, iVar, Sol[iVar]); if (dynamic) { + nodes->Set_Solution_time_n(iPoint_Local, iVar, Sol[iVar]); nodes->SetSolution_Vel(iPoint_Local, iVar, Sol[iVar+nVar]); + nodes->SetSolution_Vel_time_n(iPoint_Local, iVar, Sol[iVar+nVar]); nodes->SetSolution_Accel(iPoint_Local, iVar, Sol[iVar+2*nVar]); + nodes->SetSolution_Accel_time_n(iPoint_Local, iVar, Sol[iVar+2*nVar]); } if (fluid_structure && !dynamic) { nodes->SetSolution_Pred(iPoint_Local, iVar, Sol[iVar]); diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index 7fc4e5131a6b..be053d23d53d 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -508,7 +508,7 @@ void CMeshSolver::DeformMesh(CGeometry **geometry, CNumerics **numerics, CConfig if (ActiveTape) AD::StartRecording(); /*--- The Grid Velocity is only computed if the problem is time domain ---*/ - if (time_domain && !config->GetDiscrete_Adjoint()) ComputeGridVelocity(geometry[MESH_0], config); + if (time_domain) ComputeGridVelocity(geometry[MESH_0], config); /*--- Update the multigrid structure. ---*/ UpdateMultiGrid(geometry, config); From da2d5f69fadcb0a073eb071c4284c58645854e2a Mon Sep 17 00:00:00 2001 From: cvencro Date: Fri, 8 May 2020 13:22:27 +0100 Subject: [PATCH 62/82] update comments --- SU2_CFD/include/iteration_structure.hpp | 21 +++++++++++++++++++++ SU2_CFD/include/solvers/CDiscAdjSolver.hpp | 1 + SU2_CFD/include/solvers/CSolver.hpp | 8 ++++++++ SU2_CFD/src/drivers/CMultizoneDriver.cpp | 1 - 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/SU2_CFD/include/iteration_structure.hpp b/SU2_CFD/include/iteration_structure.hpp index 32f889c98596..1026998843c9 100644 --- a/SU2_CFD/include/iteration_structure.hpp +++ b/SU2_CFD/include/iteration_structure.hpp @@ -126,6 +126,9 @@ class CIteration { * \param[in] surface_movement - Surface movement classes of the problem. * \param[in] grid_movement - Volume grid movement classes of the problem. * \param[in] FFDBox - FFD FFDBoxes of the problem. + * \param[in] val_iZone - Index of the zone. + * \param[in] val_iInst - Index of the instance. + * \param[in] CrossTerm - Boolean to determine if this is a cross term iteration. */ virtual void Iterate(COutput *output, CIntegration ****integration, @@ -387,6 +390,9 @@ class CFluidIteration : public CIteration { * \param[in] surface_movement - Surface movement classes of the problem. * \param[in] grid_movement - Volume grid movement classes of the problem. * \param[in] FFDBox - FFD FFDBoxes of the problem. + * \param[in] val_iZone - Index of the zone. + * \param[in] val_iInst - Index of the instance. + * \param[in] CrossTerm - Boolean to determine if this is a cross term iteration. */ void Iterate(COutput *output, CIntegration ****integration, @@ -620,6 +626,9 @@ class CFEMFluidIteration : public CFluidIteration { * \param[in] surface_movement - Surface movement classes of the problem. * \param[in] grid_movement - Volume grid movement classes of the problem. * \param[in] FFDBox - FFD FFDBoxes of the problem. + * \param[in] val_iZone - Index of the zone. + * \param[in] val_iInst - Index of the instance. + * \param[in] CrossTerm - Boolean to determine if this is a cross term iteration. */ void Iterate(COutput *output, CIntegration ****integration, @@ -700,6 +709,9 @@ class CHeatIteration : public CFluidIteration { * \param[in] surface_movement - Surface movement classes of the problem. * \param[in] grid_movement - Volume grid movement classes of the problem. * \param[in] FFDBox - FFD FFDBoxes of the problem. + * \param[in] val_iZone - Index of the zone. + * \param[in] val_iInst - Index of the instance. + * \param[in] CrossTerm - Boolean to determine if this is a cross term iteration. */ void Iterate(COutput *output, CIntegration ****integration, @@ -795,6 +807,9 @@ class CFEAIteration : public CIteration { * \param[in] surface_movement - Surface movement classes of the problem. * \param[in] grid_movement - Volume grid movement classes of the problem. * \param[in] FFDBox - FFD FFDBoxes of the problem. + * \param[in] val_iZone - Index of the zone. + * \param[in] val_iInst - Index of the instance. + * \param[in] CrossTerm - Boolean to determine if this is a cross term iteration. */ void Iterate(COutput *output, CIntegration ****integration, @@ -980,6 +995,9 @@ class CAdjFluidIteration : public CFluidIteration { * \param[in] surface_movement - Surface movement classes of the problem. * \param[in] grid_movement - Volume grid movement classes of the problem. * \param[in] FFDBox - FFD FFDBoxes of the problem. + * \param[in] val_iZone - Index of the zone. + * \param[in] val_iInst - Index of the instance. + * \param[in] CrossTerm - Boolean to determine if this is a cross term iteration. */ void Iterate(COutput *output, CIntegration ****integration, @@ -1080,6 +1098,7 @@ class CDiscAdjFluidIteration : public CIteration { * \param[in] FFDBox - FFD FFDBoxes of the problem. * \param[in] val_iZone - Index of the zone. * \param[in] val_iInst - Index of the instance + * \param[in] CrossTerm - Boolean to determine if this is a cross term iteration. */ void Iterate(COutput *output, CIntegration ****integration, @@ -1366,6 +1385,7 @@ class CDiscAdjFEAIteration : public CIteration { * \param[in] FFDBox - FFD FFDBoxes of the problem. * \param[in] val_iZone - Index of the zone. * \param[in] val_iInst - Index of the instance. + * \param[in] CrossTerm - Boolean to determine if this is a cross term iteration. */ void Iterate(COutput *output, CIntegration ****integration, @@ -1634,6 +1654,7 @@ class CDiscAdjHeatIteration : public CIteration { * \param[in] FFDBox - FFD FFDBoxes of the problem. * \param[in] val_iZone - Index of the zone. * \param[in] val_iInst - Index of the instance layer. + * \param[in] CrossTerm - Boolean to determine if this is a cross term iteration. */ void Iterate(COutput *output, CIntegration ****integration, diff --git a/SU2_CFD/include/solvers/CDiscAdjSolver.hpp b/SU2_CFD/include/solvers/CDiscAdjSolver.hpp index 99c5b96c6831..f1e2ac93c35b 100644 --- a/SU2_CFD/include/solvers/CDiscAdjSolver.hpp +++ b/SU2_CFD/include/solvers/CDiscAdjSolver.hpp @@ -129,6 +129,7 @@ class CDiscAdjSolver final : public CSolver { * after tape has been evaluated. * \param[in] geometry - The geometrical definition of the problem. * \param[in] config - The particular config. + * \param[in] CrossTerm - Boolean to determine if this is a cross term extraction. */ void ExtractAdjoint_Solution(CGeometry *geometry, CConfig *config, bool CrossTerm) override; diff --git a/SU2_CFD/include/solvers/CSolver.hpp b/SU2_CFD/include/solvers/CSolver.hpp index ad464960e93c..36be90a79182 100644 --- a/SU2_CFD/include/solvers/CSolver.hpp +++ b/SU2_CFD/include/solvers/CSolver.hpp @@ -3840,6 +3840,14 @@ class CSolver { * \param[in] config - The particular config. */ inline virtual void ExtractAdjoint_Solution(CGeometry *geometry, CConfig *config){} + + /*! + * \brief A virtual member. + * \param[in] geometry - The geometrical definition of the problem. + * \param[in] solver_container - The solver container holding all solutions. + * \param[in] config - The particular config. + * \param[in] CrossTerm - Boolean to determine if this is a cross term extraction. + */ inline virtual void ExtractAdjoint_Solution(CGeometry *geometry, CConfig *config, bool CrossTerm){} /*! diff --git a/SU2_CFD/src/drivers/CMultizoneDriver.cpp b/SU2_CFD/src/drivers/CMultizoneDriver.cpp index 21ae6d984e91..25bf881fefc6 100644 --- a/SU2_CFD/src/drivers/CMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CMultizoneDriver.cpp @@ -525,7 +525,6 @@ void CMultizoneDriver::DynamicMeshUpdate(unsigned short val_iZone, unsigned long auto iteration = iteration_container[val_iZone][INST_0]; /*--- Legacy dynamic mesh update - Only if GRID_MOVEMENT = YES ---*/ - //if (!config_container[ZONE_0]->GetDeform_Mesh() && (config_container[ZONE_0]->GetGrid_Movement() || config_container[ZONE_0]->GetSurface_Movement(FLUID_STRUCTURE_STATIC))) { if (config_container[ZONE_0]->GetGrid_Movement()) { iteration->SetGrid_Movement(geometry_container[val_iZone][INST_0],surface_movement[val_iZone], grid_movement[val_iZone][INST_0], solver_container[val_iZone][INST_0], From 63e7a7968243b2b6349606f828ba8ebddb3457bd Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 24 May 2020 12:32:02 +0100 Subject: [PATCH 63/82] zero displacement for negative restarts --- SU2_CFD/src/solvers/CMeshSolver.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index d9997c635ff3..ac7e1550c2ab 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -838,11 +838,24 @@ void CMeshSolver::Restart_OldGeometry(CGeometry *geometry, CConfig *config) { if (Unst_RestartIter < 0) { - if (rank == MASTER_NODE) cout << "Requested mesh restart filename is negative. Setting known solution" << endl; + if (rank == MASTER_NODE) cout << "Requested mesh restart filename is negative. Setting zero displacement" << endl; - /*--- Set loaded solution into correct previous time containers. ---*/ - if(iStep==1) nodes->Set_Solution_time_n(); - else nodes->Set_Solution_time_n1(); + unsigned long iPoint_Global; + + for (iPoint_Global = 0; iPoint_Global < geometry->GetGlobal_nPointDomain(); iPoint_Global++) { + + auto iPoint_Local = geometry->GetGlobal_to_Local_Point(iPoint_Global); + + if (iPoint_Local >= 0) { + + for (unsigned short iDim = 0; iDim < nDim; iDim++) { + if(iStep==1) + nodes->Set_Solution_time_n(iPoint_Local, iDim, 0.0); + else + nodes->Set_Solution_time_n1(iPoint_Local, iDim, 0.0); + } + } + } } else { string filename_n = config->GetUnsteady_FileName(filename, Unst_RestartIter, ""); From 6afea3ae498abf2bea3864cc1f1fd026588befab Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 24 May 2020 19:32:41 +0100 Subject: [PATCH 64/82] handle previous time step volumes in Preprocess --- Common/include/geometry/dual_grid/CPoint.hpp | 34 ++++++++++++++-- SU2_CFD/src/iteration_structure.cpp | 42 ++++++++++++++++++++ TestCases/serial_regression_AD.py | 2 +- 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/Common/include/geometry/dual_grid/CPoint.hpp b/Common/include/geometry/dual_grid/CPoint.hpp index 3355d357f8ab..e5697789679b 100644 --- a/Common/include/geometry/dual_grid/CPoint.hpp +++ b/Common/include/geometry/dual_grid/CPoint.hpp @@ -43,6 +43,9 @@ class CPoint final : public CDualGrid { vector Point; /*!< \brief Points surrounding the central node of the control volume. */ vector Edge; /*!< \brief Edges that set up a control volume. */ su2double *Volume; /*!< \brief Volume or Area of the control volume in 3D and 2D. */ + su2double Volume_Old; /*!< \brief Old containers for Volume. */ + su2double Volume_n_Old; /*!< \brief Old containers for Volume at time n. */ + su2double Volume_nM1_Old; /*!< \brief Old containers for Volume at time n-1. */ su2double Periodic_Volume; /*!< \brief Missing component of volume or area of a control volume on a periodic marker in 3D and 2D. */ bool Domain, /*!< \brief Indicates if a point must be computed or belong to another boundary */ Boundary, /*!< \brief To see if a point belong to the boundary (including MPI). */ @@ -457,8 +460,8 @@ class CPoint final : public CDualGrid { inline su2double GetVolume_n(void) const { return Volume[1]; } /*! - * \brief Get the volume of the control volume at time n+1. - * \return Volume of the control volume at time n+1 + * \brief Get the volume of the control volume at time n-1. + * \return Volume of the control volume at time n-1 */ inline su2double GetVolume_nM1(void) const { return Volume[2]; } @@ -468,10 +471,35 @@ class CPoint final : public CDualGrid { inline void SetVolume_n(void) { Volume[1] = Volume[0]; } /*! - * \brief Set the volume of the control volume at time n+1. + * \brief Set the volume of the control volume at time n-1. */ inline void SetVolume_nM1(void) { Volume[2] = Volume[1]; } + /*! + * \brief Set the volume of the control volume at time n using n-1. + */ + inline void SetVolume_n_from_OldnM1(void) { Volume[1] = Volume_nM1_Old; } + + /*! + * \brief Set the volume of the control volume at current time using time n. + */ + inline void SetVolume_from_Oldn(void) { Volume[0] = Volume_n_Old; } + + /*! + * \brief Set the Volume to Volume_Old. + */ + inline void SetVolume_Old(void) {Volume_Old = Volume[0];} + + /*! + * \brief Set the Volume_n to Volume_n_Old. + */ + inline void SetVolume_n_Old(void) {Volume_n_Old = Volume[1];} + + /*! + * \brief Set the Volume_nM1 to Volume_nM1_Old. + */ + inline void SetVolume_nM1_Old(void) {Volume_nM1_Old = Volume[2];} + /*! * \brief Get the coordinates of the control volume at time n. * \return Coordinates of the control volume at time n. diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index 7aa4b6083f67..9fb5f6c73501 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -1795,6 +1795,12 @@ void CDiscAdjFluidIteration::Preprocess(COutput *output, geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetCoord_n1(); } } + if (config[val_iZone]->GetDynamic_Grid()) { + for(iPoint=0; iPointGetnPoint();iPoint++) { + geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetVolume_n(); + geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetVolume_nM1(); + } + } } } if (dual_time) { @@ -1817,6 +1823,11 @@ void CDiscAdjFluidIteration::Preprocess(COutput *output, geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetCoord_n(); } } + if (config[val_iZone]->GetDynamic_Grid()) { + for(iPoint=0; iPointGetnPoint();iPoint++) { + geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetVolume_n(); + } + } } } @@ -1837,6 +1848,18 @@ void CDiscAdjFluidIteration::Preprocess(COutput *output, Afterwards the GridVelocity is computed based on the Coordinates. ---*/ + /*--- Temporarily store the loaded volumes in to old containers ---*/ + if (config[val_iZone]->GetDynamic_Grid()) { + for (iMesh=0; iMesh<=config[val_iZone]->GetnMGLevels();iMesh++) { + for(iPoint=0; iPointGetnPoint();iPoint++) { + geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetVolume_Old(); + geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetVolume_n_Old(); + geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetVolume_nM1_Old(); + } + } + } + + /*-- Load mesh solver ---*/ if (config[val_iZone]->GetDeform_Mesh()) { solver[val_iZone][val_iInst][MESH_0][MESH_SOL]->LoadRestart(geometry[val_iZone][val_iInst], solver[val_iZone][val_iInst], config[val_iZone], Direct_Iter, true); } @@ -1846,6 +1869,25 @@ void CDiscAdjFluidIteration::Preprocess(COutput *output, LoadUnsteady_Solution(geometry, solver,config, val_iZone, val_iInst, Direct_Iter - 1); } else { LoadUnsteady_Solution(geometry, solver,config, val_iZone, val_iInst, Direct_Iter - 2); + + /*--- Set volumes into correct containers ---*/ + if (config[val_iZone]->GetDynamic_Grid()) { + for (iMesh=0; iMesh<=config[val_iZone]->GetnMGLevels();iMesh++) { + for(iPoint=0; iPointGetnPoint();iPoint++) { + + /*--- If negative iteration number, set default ---*/ + if (Direct_Iter - 2 < 0) geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetVolume(0.0); + + /*--- Set currently loaded volume to Volume_nM1 ---*/ + geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetVolume_n(); + geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetVolume_nM1(); + + /*--- Set Volume_n and Volume from old containers ---*/ + geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetVolume_n_from_OldnM1(); + geometry[val_iZone][val_iInst][iMesh]->node[iPoint]->SetVolume_from_Oldn(); + } + } + } } diff --git a/TestCases/serial_regression_AD.py b/TestCases/serial_regression_AD.py index c3ed71e4c502..35a03df61bdc 100644 --- a/TestCases/serial_regression_AD.py +++ b/TestCases/serial_regression_AD.py @@ -210,7 +210,7 @@ def main(): unst_deforming_naca0012.cfg_dir = "disc_adj_euler/naca0012_pitching_def" unst_deforming_naca0012.cfg_file = "inv_NACA0012_pitching_deform_ad.cfg" unst_deforming_naca0012.test_iter = 4 - unst_deforming_naca0012.test_vals = [-1.869488, -1.745821, 1094.3, 0.000006] #last 4 columns + unst_deforming_naca0012.test_vals = [-1.963408, -1.843286, 1.0858e+03, 4.0932e-06] #last 4 columns unst_deforming_naca0012.su2_exec = "SU2_CFD_AD" unst_deforming_naca0012.timeout = 1600 unst_deforming_naca0012.tol = 0.00001 From e8962034a2503344e5a34f9b30ace1455fb1c134 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 24 May 2020 19:58:20 +0100 Subject: [PATCH 65/82] fix restarted previous time FEA solution for adjoint problem --- SU2_CFD/src/solvers/CFEASolver.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SU2_CFD/src/solvers/CFEASolver.cpp b/SU2_CFD/src/solvers/CFEASolver.cpp index ce00b59556ab..b30fa8751320 100644 --- a/SU2_CFD/src/solvers/CFEASolver.cpp +++ b/SU2_CFD/src/solvers/CFEASolver.cpp @@ -3363,11 +3363,11 @@ void CFEASolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig *c for (unsigned short iVar = 0; iVar < nVar; iVar++) { nodes->SetSolution(iPoint_Local, iVar, Sol[iVar]); if (dynamic) { - nodes->Set_Solution_time_n(iPoint_Local, iVar, Sol[iVar]); + if (!discrete_adjoint) nodes->Set_Solution_time_n(iPoint_Local, iVar, Sol[iVar]); nodes->SetSolution_Vel(iPoint_Local, iVar, Sol[iVar+nVar]); - nodes->SetSolution_Vel_time_n(iPoint_Local, iVar, Sol[iVar+nVar]); + if (!discrete_adjoint) nodes->SetSolution_Vel_time_n(iPoint_Local, iVar, Sol[iVar+nVar]); nodes->SetSolution_Accel(iPoint_Local, iVar, Sol[iVar+2*nVar]); - nodes->SetSolution_Accel_time_n(iPoint_Local, iVar, Sol[iVar+2*nVar]); + if (!discrete_adjoint) nodes->SetSolution_Accel_time_n(iPoint_Local, iVar, Sol[iVar+2*nVar]); } if (fluid_structure && !dynamic) { nodes->SetSolution_Pred(iPoint_Local, iVar, Sol[iVar]); From f3e38927810e338ba729bda4642cd655d85e995a Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 25 May 2020 01:23:53 +0100 Subject: [PATCH 66/82] fix tab to spaces --- SU2_CFD/src/iteration_structure.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SU2_CFD/src/iteration_structure.cpp b/SU2_CFD/src/iteration_structure.cpp index b0b86214b873..7cee37288d1e 100644 --- a/SU2_CFD/src/iteration_structure.cpp +++ b/SU2_CFD/src/iteration_structure.cpp @@ -1867,8 +1867,8 @@ void CDiscAdjFluidIteration::Preprocess(COutput *output, if (Direct_Iter - 2 < 0) { for(iPoint=0; iPointGetnPoint();iPoint++) { geometry[val_iZone][val_iInst][iMesh]->nodes->SetVolume(iPoint,0.0); - } - } + } + } /*--- Set currently loaded volume to Volume_nM1 ---*/ geometry[val_iZone][val_iInst][iMesh]->nodes->SetVolume_n(); From 4a8f762bb4518993200fe3b5531c064c74cf15cc Mon Sep 17 00:00:00 2001 From: cvencro Date: Fri, 11 Sep 2020 06:08:13 +0100 Subject: [PATCH 67/82] fix dynamic grid velocity output --- SU2_CFD/src/output/CFlowCompOutput.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SU2_CFD/src/output/CFlowCompOutput.cpp b/SU2_CFD/src/output/CFlowCompOutput.cpp index c43063747bf4..95b055171280 100644 --- a/SU2_CFD/src/output/CFlowCompOutput.cpp +++ b/SU2_CFD/src/output/CFlowCompOutput.cpp @@ -459,7 +459,7 @@ void CFlowCompOutput::LoadVolumeData(CConfig *config, CGeometry *geometry, CSolv break; } - if (config->GetGrid_Movement()){ + if (gridMovement){ SetVolumeOutputValue("GRID_VELOCITY-X", iPoint, Node_Geo->GetGridVel(iPoint)[0]); SetVolumeOutputValue("GRID_VELOCITY-Y", iPoint, Node_Geo->GetGridVel(iPoint)[1]); if (nDim == 3) From 59c8d1de6bf1dc78c2db29043438632f68926fc6 Mon Sep 17 00:00:00 2001 From: cvencro Date: Tue, 15 Sep 2020 12:21:02 +0100 Subject: [PATCH 68/82] test transfer of interface velocities --- SU2_CFD/include/solvers/CFEASolver.hpp | 5 +- SU2_CFD/include/solvers/CMeshSolver.hpp | 2 + SU2_CFD/include/solvers/CSolver.hpp | 4 + .../include/variables/CMeshBoundVariable.hpp | 30 +++++- SU2_CFD/include/variables/CVariable.hpp | 4 +- SU2_CFD/src/drivers/CDriver.cpp | 3 +- .../fsi/CDisplacementsInterface.cpp | 21 +++- SU2_CFD/src/solvers/CFEASolver.cpp | 20 ++++ SU2_CFD/src/solvers/CMeshSolver.cpp | 98 ++++++++++++++++++- SU2_CFD/src/variables/CMeshBoundVariable.cpp | 1 + 10 files changed, 180 insertions(+), 8 deletions(-) diff --git a/SU2_CFD/include/solvers/CFEASolver.hpp b/SU2_CFD/include/solvers/CFEASolver.hpp index b801928d9602..32c9f7fe7626 100644 --- a/SU2_CFD/include/solvers/CFEASolver.hpp +++ b/SU2_CFD/include/solvers/CFEASolver.hpp @@ -449,7 +449,10 @@ class CFEASolver : public CSolver { CNumerics *numerics, const CConfig *config, unsigned short val_marker) final; - + void BC_Velocity(CGeometry *geometry, + CNumerics *numerics, + const CConfig *config, + unsigned short val_marker) final; /*! * \brief Iterate using an implicit Newmark solver. * \param[in] geometry - Geometrical definition of the problem. diff --git a/SU2_CFD/include/solvers/CMeshSolver.hpp b/SU2_CFD/include/solvers/CMeshSolver.hpp index 54f4ec8e7b4b..ae126972deea 100644 --- a/SU2_CFD/include/solvers/CMeshSolver.hpp +++ b/SU2_CFD/include/solvers/CMeshSolver.hpp @@ -86,6 +86,7 @@ class CMeshSolver final : public CFEASolver { * \param[in] config - Definition of the particular problem. */ void ComputeGridVelocity(CGeometry *geometry, CConfig *config); + void ComputeGridVelocity_FromBoundary(CGeometry **geometry, CNumerics **numerics, CConfig *config); /*! * \brief Update the coarse multigrid levels after the grid movement. @@ -100,6 +101,7 @@ class CMeshSolver final : public CFEASolver { * \param[in] config - Definition of the particular problem. */ void SetBoundaryDisplacements(CGeometry *geometry, CNumerics *numerics, CConfig *config); + void SetBoundaryVelocities(CGeometry *geometry, CNumerics *numerics, CConfig *config); public: /*! diff --git a/SU2_CFD/include/solvers/CSolver.hpp b/SU2_CFD/include/solvers/CSolver.hpp index a2a53d19f8f2..a78ba4cee1ec 100644 --- a/SU2_CFD/include/solvers/CSolver.hpp +++ b/SU2_CFD/include/solvers/CSolver.hpp @@ -990,6 +990,10 @@ class CSolver { CNumerics *numerics, const CConfig *config, unsigned short val_marker) { } + inline virtual void BC_Velocity(CGeometry *geometry, + CNumerics *numerics, + const CConfig *config, + unsigned short val_marker) { } /*! * \brief A virtual member. diff --git a/SU2_CFD/include/variables/CMeshBoundVariable.hpp b/SU2_CFD/include/variables/CMeshBoundVariable.hpp index 21e2dd5481d4..9c32c5453c55 100644 --- a/SU2_CFD/include/variables/CMeshBoundVariable.hpp +++ b/SU2_CFD/include/variables/CMeshBoundVariable.hpp @@ -35,7 +35,7 @@ class CMeshBoundVariable final : public CMeshVariable { private: MatrixType Boundary_Displacement; /*!< \brief Store the reference coordinates of the mesh. */ - + MatrixType Boundary_Velocity; CVertexMap VertexMap; /*!< \brief Object that controls accesses to the variables of this class. */ public: @@ -87,6 +87,34 @@ class CMeshBoundVariable final : public CMeshVariable { Boundary_Displacement(iPoint,iDim) = val_BoundDisp; } +/*! + * \brief Get the value of the displacement imposed at the boundary. + * \return Value of the boundary velocity. + */ + inline su2double GetBound_Vel(unsigned long iPoint, unsigned long iDim) const override { + if (!VertexMap.GetVertexIndex(iPoint)) return 0.0; + return Boundary_Velocity(iPoint,iDim); + } + + /*! + * \brief Set the boundary displacements. + * \param[in] val_BoundVel - Pointer to the boundary velocities. + */ + inline void SetBound_Vel(unsigned long iPoint, const su2double *val_BoundVel) override { + if (!VertexMap.GetVertexIndex(iPoint)) return; + for (unsigned long iDim = 0; iDim < nDim; iDim++) Boundary_Velocity(iPoint,iDim) = val_BoundVel[iDim]; + } + + /*! + * \brief Set the boundary velocity. + * \param[in] iDim - Index of the dimension of interest. + * \param[in] val_BoundVel - Value of the boundary velocities. + */ + inline void SetBound_Vel(unsigned long iPoint, unsigned long iDim, su2double val_BoundVel) override { + if (!VertexMap.GetVertexIndex(iPoint)) return; + Boundary_Velocity(iPoint,iDim) = val_BoundVel; + } + /*! * \brief Register the boundary displacements of the mesh. * \param[in] input - Defines whether we are registering the variable as input or as output. diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index bbda5e230470..ed7c3d541c38 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -2435,13 +2435,14 @@ class CVariable { * \return Value of the boundary displacement. */ inline virtual su2double GetBound_Disp(unsigned long iPoint, unsigned long iDim) const { return 0.0; } + inline virtual su2double GetBound_Vel(unsigned long iPoint, unsigned long iDim) const { return 0.0; } /*! * \brief A virtual member. Set the boundary displacement. * \param[in] val_BoundDisp - Pointer to the boundary displacements. */ inline virtual void SetBound_Disp(unsigned long iPoint, const su2double *val_BoundDisp) { } - + inline virtual void SetBound_Vel(unsigned long iPoint, const su2double *val_BoundDisp) { } /*! * \brief A virtual member. Set the boundary displacement. @@ -2449,6 +2450,7 @@ class CVariable { * \param[in] val_BoundDisp - Value of the boundary displacements. */ inline virtual void SetBound_Disp(unsigned long iPoint, unsigned long iDim, const su2double val_BoundDisp) { } + inline virtual void SetBound_Vel(unsigned long iPoint, unsigned long iDim, const su2double val_BoundDisp) { } /*! * \brief A virtual member. Get the value of the displacement imposed at the boundary. diff --git a/SU2_CFD/src/drivers/CDriver.cpp b/SU2_CFD/src/drivers/CDriver.cpp index e03bf30cf146..a439ad0eb894 100644 --- a/SU2_CFD/src/drivers/CDriver.cpp +++ b/SU2_CFD/src/drivers/CDriver.cpp @@ -2579,7 +2579,8 @@ void CDriver::Interface_Preprocessing(CConfig **config, CSolver***** solver, CGe "Use DEFORM_MESH=YES, and setup MARKER_DEFORM_MESH=(...)", CURRENT_FUNCTION); } interface_type = BOUNDARY_DISPLACEMENTS; - interface[donor][target] = new CDisplacementsInterface(nDim, 0); + if (!config[donor]->GetTime_Domain()) interface[donor][target] = new CDisplacementsInterface(nDim, 0); + else interface[donor][target] = new CDisplacementsInterface(2*nDim, 0); if (rank == MASTER_NODE) cout << "boundary displacements from the structural solver." << endl; } else if (fluid_donor && fluid_target) { diff --git a/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp b/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp index f38b18fce40f..578462ebaf38 100644 --- a/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp +++ b/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp @@ -43,12 +43,29 @@ void CDisplacementsInterface::GetDonor_Variable(CSolver *struct_solution, CGeome for (auto iVar = 0u; iVar < nVar; iVar++) Donor_Variable[iVar] = DisplacementDonor[iVar]; + + if (struct_config->GetTime_Domain()) { + auto VelocityDonor = struct_solution->GetNodes()->GetSolution_Vel(Point_Struct); + for (auto iVar = nVar/2; iVar < nVar; iVar++)//Assuming dynamic interface always has nVar = 2*nDim, 2D: 4, 3D: 6 + Donor_Variable[iVar] = VelocityDonor[iVar-nVar/2]; + } } void CDisplacementsInterface::SetTarget_Variable(CSolver *mesh_solver, CGeometry *flow_geometry, const CConfig *flow_config, unsigned long Marker_Flow, unsigned long Vertex_Flow, unsigned long Point_Mesh) { - /*--- Impose the boundary displacements ---*/ - mesh_solver->GetNodes()->SetBound_Disp(Point_Mesh,Target_Variable); + if (!flow_config->GetTime_Domain()) { + /*--- Impose the boundary displacements ---*/ + mesh_solver->GetNodes()->SetBound_Disp(Point_Mesh,Target_Variable); + } else { + /*--- Impose the boundary displacements ---*/ + for (auto iVar = 0u; iVar < nVar/2; iVar++) + mesh_solver->GetNodes()->SetBound_Disp(Point_Mesh,iVar,Target_Variable[iVar]); + + /*--- Impose the boundary velocities ---*/ + for (auto iVar = nVar/2; iVar < nVar; iVar++) + mesh_solver->GetNodes()->SetBound_Vel(Point_Mesh,iVar-nVar/2,Target_Variable[iVar]); + } + } diff --git a/SU2_CFD/src/solvers/CFEASolver.cpp b/SU2_CFD/src/solvers/CFEASolver.cpp index d594c78e41b6..c879fc049a6c 100644 --- a/SU2_CFD/src/solvers/CFEASolver.cpp +++ b/SU2_CFD/src/solvers/CFEASolver.cpp @@ -2233,6 +2233,26 @@ void CFEASolver::BC_Deforming(CGeometry *geometry, CNumerics *numerics, const CC } +void CFEASolver::BC_Velocity(CGeometry *geometry, CNumerics *numerics, const CConfig *config, unsigned short val_marker){ + + for (auto iVertex = 0ul; iVertex < geometry->nVertex[val_marker]; iVertex++) { + + /*--- Get node index ---*/ + auto iNode = geometry->vertex[val_marker][iVertex]->GetNode(); + + /*--- Retrieve the boundary velocity ---*/ + su2double Vel[MAXNVAR] = {0.0}; + for (unsigned short iDim = 0; iDim < nDim; iDim++) + Vel[iDim] = nodes->GetBound_Vel(iNode,iDim); + + /*--- Set and enforce solution ---*/ + LinSysSol.SetBlock(iNode, Vel); + Jacobian.EnforceSolutionAtNode(iNode, Vel, LinSysRes); + + } + +} + su2double CFEASolver::Compute_LoadCoefficient(su2double CurrentTime, su2double RampTime, const CConfig *config){ su2double LoadCoeff = 1.0; diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index b548d467affa..1f9ff33cbba5 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -514,7 +514,11 @@ void CMeshSolver::DeformMesh(CGeometry **geometry, CNumerics **numerics, CConfig UpdateDualGrid(geometry[MESH_0], config); /*--- The Grid Velocity is only computed if the problem is time domain ---*/ - if (time_domain) ComputeGridVelocity(geometry[MESH_0], config); + if (time_domain) { + //Test with unused boolean to switch between grid velocity computations + if (config->GetWrt_Slice()) ComputeGridVelocity(geometry[MESH_0], config); + else ComputeGridVelocity_FromBoundary(geometry, numerics, config); + } /*--- Update the multigrid structure. ---*/ UpdateMultiGrid(geometry, config); @@ -566,6 +570,34 @@ void CMeshSolver::UpdateDualGrid(CGeometry *geometry, CConfig *config){ } +void CMeshSolver::ComputeGridVelocity_FromBoundary(CGeometry **geometry, CNumerics **numerics, CConfig *config){ + + /*--- Compute the stiffness matrix, no point recording because we clear the residual. ---*/ + + const bool wasActive = AD::BeginPassive(); + + Compute_StiffMatrix(geometry[MESH_0], numerics, config); + + AD::EndPassive(wasActive); + + /*--- Clear residual (loses AD info), we do not want an incremental solution. ---*/ + SU2_OMP_PARALLEL { + LinSysRes.SetValZero(); + } + + /*--- Impose boundary conditions including bouundary velocity ---*/ + SetBoundaryVelocities(geometry[MESH_0], numerics[FEA_TERM], config); + + /*--- Solve the linear system. ---*/ + Solve_System(geometry[MESH_0], config); + for (unsigned long iPoint = 0; iPoint < nPointDomain; iPoint++) { + for (unsigned short iDim = 0; iDim < nDim; iDim++) { + su2double val_vel = LinSysSol(iPoint, iDim); + geometry[MESH_0]->nodes->SetGridVel(iPoint, iDim, val_vel); + } + } +} + void CMeshSolver::ComputeGridVelocity(CGeometry *geometry, CConfig *config){ /*--- Compute the velocity of each node in the domain of the current rank @@ -696,6 +728,68 @@ void CMeshSolver::SetBoundaryDisplacements(CGeometry *geometry, CNumerics *numer } +void CMeshSolver::SetBoundaryVelocities(CGeometry *geometry, CNumerics *numerics, CConfig *config){ + + unsigned short iMarker; + + /*--- Impose zero displacements of all non-moving surfaces (also at nodes in multiple moving/non-moving boundaries). ---*/ + /*--- Exceptions: symmetry plane, the receive boundaries and periodic boundaries should get a different treatment. ---*/ + for (iMarker = 0; iMarker < config->GetnMarker_All(); iMarker++) { + if ((config->GetMarker_All_Deform_Mesh(iMarker) == NO) && + (config->GetMarker_All_Moving(iMarker) == NO) && + (config->GetMarker_All_KindBC(iMarker) != SYMMETRY_PLANE) && + (config->GetMarker_All_KindBC(iMarker) != SEND_RECEIVE) && + (config->GetMarker_All_KindBC(iMarker) != PERIODIC_BOUNDARY)) { + + BC_Clamped(geometry, numerics, config, iMarker); + } + } + + /*--- Symmetry plane is clamped, for now. ---*/ + for (iMarker = 0; iMarker < config->GetnMarker_All(); iMarker++) { + if ((config->GetMarker_All_Deform_Mesh(iMarker) == NO) && + (config->GetMarker_All_Moving(iMarker) == NO) && + (config->GetMarker_All_KindBC(iMarker) == SYMMETRY_PLANE)) { + + BC_Clamped(geometry, numerics, config, iMarker); + } + } + + /*--- Impose displacement boundary conditions. ---*/ + for (iMarker = 0; iMarker < config->GetnMarker_All(); iMarker++) { + if ((config->GetMarker_All_Deform_Mesh(iMarker) == YES) || + (config->GetMarker_All_Moving(iMarker) == YES)) { + + BC_Deforming(geometry, numerics, config, iMarker); + } + } + + /*--- Impose velocity boundary conditions. ---*/ + for (iMarker = 0; iMarker < config->GetnMarker_All(); iMarker++) { + if ((config->GetMarker_All_Deform_Mesh(iMarker) == YES) || + (config->GetMarker_All_Moving(iMarker) == YES)) { + + BC_Velocity(geometry, numerics, config, iMarker); + } + } + + /*--- Clamp far away nodes according to deform limit. ---*/ + if ((config->GetDeform_Stiffness_Type() == SOLID_WALL_DISTANCE) && + (config->GetDeform_Limit() < MaxDistance)) { + + const su2double limit = config->GetDeform_Limit() / MaxDistance; + + for (auto iPoint = 0ul; iPoint < nPoint; ++iPoint) { + if (nodes->GetWallDistance(iPoint) <= limit) continue; + + su2double zeros[MAXNVAR] = {0.0}; + nodes->SetSolution(iPoint, zeros); + LinSysSol.SetBlock(iPoint, zeros); + Jacobian.EnforceSolutionAtNode(iPoint, zeros, LinSysRes); + } + } +} + void CMeshSolver::SetDualTime_Mesh(void){ nodes->Set_Solution_time_n1(); @@ -783,7 +877,7 @@ void CMeshSolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig * Restart_OldGeometry(geometry[MESH_0], config); /*--- Once Displacement_n and Displacement_n1 are filled, we can compute the Grid Velocity ---*/ - ComputeGridVelocity(geometry[MESH_0], config); + ComputeGridVelocity(geometry[MESH_0], config);//To Do: Update to read-in grid velocity from the solution file rather than recalculated } /*--- Update the multigrid structure after setting up the finest grid, diff --git a/SU2_CFD/src/variables/CMeshBoundVariable.cpp b/SU2_CFD/src/variables/CMeshBoundVariable.cpp index 72f6cc043e28..588d50e0c8dc 100644 --- a/SU2_CFD/src/variables/CMeshBoundVariable.cpp +++ b/SU2_CFD/src/variables/CMeshBoundVariable.cpp @@ -45,6 +45,7 @@ void CMeshBoundVariable::AllocateBoundaryVariables(CConfig *config) { /*--- Allocate ---*/ Boundary_Displacement.resize(nBoundPt,nDim) = su2double(0.0); + if (config->GetTime_Domain()) Boundary_Velocity.resize(nBoundPt,nDim) = su2double(0.0); } void CMeshBoundVariable::Register_BoundDisp(bool input) { From d1ef81afed47bacfb0034419da85ceb965bb0f8b Mon Sep 17 00:00:00 2001 From: cvencro Date: Tue, 15 Sep 2020 14:22:40 +0100 Subject: [PATCH 69/82] remove second call for deforming bc and update grid vel mpi comms --- SU2_CFD/src/solvers/CMeshSolver.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index 1f9ff33cbba5..bf489e7074d6 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -583,6 +583,7 @@ void CMeshSolver::ComputeGridVelocity_FromBoundary(CGeometry **geometry, CNumeri /*--- Clear residual (loses AD info), we do not want an incremental solution. ---*/ SU2_OMP_PARALLEL { LinSysRes.SetValZero(); + LinSysSol.SetValZero(); } /*--- Impose boundary conditions including bouundary velocity ---*/ @@ -596,6 +597,10 @@ void CMeshSolver::ComputeGridVelocity_FromBoundary(CGeometry **geometry, CNumeri geometry[MESH_0]->nodes->SetGridVel(iPoint, iDim, val_vel); } } + + /*--- The velocity was computed for nPointDomain, now we communicate it. ---*/ + geometry[MESH_0]->InitiateComms(geometry[MESH_0], config, GRID_VELOCITY); + geometry[MESH_0]->CompleteComms(geometry[MESH_0], config, GRID_VELOCITY); } void CMeshSolver::ComputeGridVelocity(CGeometry *geometry, CConfig *config){ @@ -755,15 +760,6 @@ void CMeshSolver::SetBoundaryVelocities(CGeometry *geometry, CNumerics *numerics } } - /*--- Impose displacement boundary conditions. ---*/ - for (iMarker = 0; iMarker < config->GetnMarker_All(); iMarker++) { - if ((config->GetMarker_All_Deform_Mesh(iMarker) == YES) || - (config->GetMarker_All_Moving(iMarker) == YES)) { - - BC_Deforming(geometry, numerics, config, iMarker); - } - } - /*--- Impose velocity boundary conditions. ---*/ for (iMarker = 0; iMarker < config->GetnMarker_All(); iMarker++) { if ((config->GetMarker_All_Deform_Mesh(iMarker) == YES) || From 1f63e577fec13e723333c4687f68d01844e39b59 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 27 Sep 2020 09:44:59 +0100 Subject: [PATCH 70/82] set grid velocity from restart files --- SU2_CFD/src/solvers/CMeshSolver.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index bf489e7074d6..80d06e73d45b 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -833,6 +833,8 @@ void CMeshSolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig * minus the coordinates of the reference mesh file ---*/ su2double displ = curr_coord - nodes->GetMesh_Coord(iPoint_Local, iDim); nodes->SetSolution(iPoint_Local, iDim, displ); + su2double vel = Restart_Data[index+iDim+6]; + if (time_domain && !config->GetWrt_Slice()) geometry[MESH_0]->nodes->SetGridVel(iPoint_Local, iDim, Restart_Data[index+iDim+6]); } /*--- Increment the overall counter for how many points have been loaded. ---*/ @@ -868,7 +870,7 @@ void CMeshSolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig * UpdateDualGrid(geometry[MESH_0], config); /*--- For time-domain problems, we need to compute the grid velocities ---*/ - if (time_domain){ + if (time_domain && config->GetWrt_Slice()){ /*--- Update the old geometry (coordinates n and n-1) ---*/ Restart_OldGeometry(geometry[MESH_0], config); /*--- Once Displacement_n and Displacement_n1 are filled, From 69904b479510739e3f18a30f0fd2de62d79dbf77 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 28 Sep 2020 01:08:53 +0100 Subject: [PATCH 71/82] update grid velocities before transfer in case of relaxation --- SU2_CFD/src/drivers/CMultizoneDriver.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/SU2_CFD/src/drivers/CMultizoneDriver.cpp b/SU2_CFD/src/drivers/CMultizoneDriver.cpp index 3fd1b558ba9b..f95983444140 100644 --- a/SU2_CFD/src/drivers/CMultizoneDriver.cpp +++ b/SU2_CFD/src/drivers/CMultizoneDriver.cpp @@ -455,16 +455,23 @@ void CMultizoneDriver::Update() { for (auto jZone = 0u; jZone < nZone; jZone++){ /*--- The target zone is iZone ---*/ if (jZone != iZone){ + // Run update on structural solution to update relaxation on grid velocities before transferring data + if (config_container[jZone]->GetStructuralProblem()) { + iteration_container[jZone][INST_0]->Update(output_container[jZone], integration_container, geometry_container, + solver_container, numerics_container, config_container, + surface_movement, grid_movement, FFDBox, jZone, INST_0); + } UpdateMesh += Transfer_Data(jZone, iZone); } } /*--- If a mesh update is required due to the transfer of data ---*/ if (UpdateMesh > 0) DynamicMeshUpdate(iZone, TimeIter); - iteration_container[iZone][INST_0]->Update(output_container[iZone], integration_container, geometry_container, - solver_container, numerics_container, config_container, - surface_movement, grid_movement, FFDBox, iZone, INST_0); - + if (!config_container[iZone]->GetStructuralProblem()) { + iteration_container[iZone][INST_0]->Update(output_container[iZone], integration_container, geometry_container, + solver_container, numerics_container, config_container, + surface_movement, grid_movement, FFDBox, iZone, INST_0); + } /*--- Set the Convergence_FSI boolean to false for the next time step ---*/ for (unsigned short iSol = 0; iSol < MAX_SOLS-1; iSol++){ if (integration_container[iZone][INST_0][iSol] != nullptr){ From a10a26cae9f5f416abf904550f4f03960451e945 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 4 Oct 2020 19:29:14 +0100 Subject: [PATCH 72/82] easy switch to turn off grid velocity --- SU2_CFD/src/solvers/CMeshSolver.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index 80d06e73d45b..dc062ba5896b 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -515,9 +515,16 @@ void CMeshSolver::DeformMesh(CGeometry **geometry, CNumerics **numerics, CConfig /*--- The Grid Velocity is only computed if the problem is time domain ---*/ if (time_domain) { - //Test with unused boolean to switch between grid velocity computations - if (config->GetWrt_Slice()) ComputeGridVelocity(geometry[MESH_0], config); - else ComputeGridVelocity_FromBoundary(geometry, numerics, config); + if (config->GetQCR()) {//Test with boolean to disable grid velocity calculation + //SA_QCR= YES: Include Grid Velocity + //SA_QCR= NO: Zero Grid Velocity + + //Test with unused boolean to switch between grid velocity computations + //WRT_SLICE = YES: FD Grid velocity + //WRT_SLICE = NO: Boundary grid velocity + if (config->GetWrt_Slice()) ComputeGridVelocity(geometry[MESH_0], config); + else ComputeGridVelocity_FromBoundary(geometry, numerics, config); + } } /*--- Update the multigrid structure. ---*/ @@ -834,7 +841,7 @@ void CMeshSolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig * su2double displ = curr_coord - nodes->GetMesh_Coord(iPoint_Local, iDim); nodes->SetSolution(iPoint_Local, iDim, displ); su2double vel = Restart_Data[index+iDim+6]; - if (time_domain && !config->GetWrt_Slice()) geometry[MESH_0]->nodes->SetGridVel(iPoint_Local, iDim, Restart_Data[index+iDim+6]); + if (time_domain && !config->GetWrt_Slice() && config->GetQCR()) geometry[MESH_0]->nodes->SetGridVel(iPoint_Local, iDim, Restart_Data[index+iDim+6]); } /*--- Increment the overall counter for how many points have been loaded. ---*/ @@ -875,7 +882,7 @@ void CMeshSolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig * Restart_OldGeometry(geometry[MESH_0], config); /*--- Once Displacement_n and Displacement_n1 are filled, we can compute the Grid Velocity ---*/ - ComputeGridVelocity(geometry[MESH_0], config);//To Do: Update to read-in grid velocity from the solution file rather than recalculated + if (config->GetQCR()) ComputeGridVelocity(geometry[MESH_0], config); } /*--- Update the multigrid structure after setting up the finest grid, From 7ef0115c81d288f6d71bdece11b93f6512f28ad8 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 4 Oct 2020 22:23:44 +0100 Subject: [PATCH 73/82] predicted velocity for fsi transfer --- Common/include/option_structure.hpp | 3 ++- SU2_CFD/include/solvers/CFEASolver.hpp | 1 + .../include/solvers/CFVMFlowSolverBase.inl | 2 +- SU2_CFD/include/solvers/CSolver.hpp | 2 ++ SU2_CFD/include/variables/CFEAVariable.hpp | 12 ++++++++++ SU2_CFD/include/variables/CVariable.hpp | 5 +++++ .../fsi/CDisplacementsInterface.cpp | 2 +- .../src/iteration/CDiscAdjFEAIteration.cpp | 2 ++ SU2_CFD/src/iteration/CFEAIteration.cpp | 5 +++-- SU2_CFD/src/solvers/CFEASolver.cpp | 22 +++++++++++++++++-- SU2_CFD/src/solvers/CSolver.cpp | 12 ++++++++++ SU2_CFD/src/variables/CFEAVariable.cpp | 1 + 12 files changed, 62 insertions(+), 7 deletions(-) diff --git a/Common/include/option_structure.hpp b/Common/include/option_structure.hpp index 4d988c21d960..ddd5b9478704 100644 --- a/Common/include/option_structure.hpp +++ b/Common/include/option_structure.hpp @@ -2179,7 +2179,8 @@ enum MPI_QUANTITIES { MESH_DISPLACEMENTS = 27, /*!< \brief Mesh displacements at the interface. */ SOLUTION_TIME_N = 28, /*!< \brief Solution at time n. */ SOLUTION_TIME_N1 = 29, /*!< \brief Solution at time n-1. */ - PRIMITIVE = 30 /*!< \brief Primitive solution communication. */ + PRIMITIVE = 30, /*!< \brief Primitive solution communication. */ + SOLUTION_VEL_PRED = 31 }; /*! diff --git a/SU2_CFD/include/solvers/CFEASolver.hpp b/SU2_CFD/include/solvers/CFEASolver.hpp index 32c9f7fe7626..7862a984140a 100644 --- a/SU2_CFD/include/solvers/CFEASolver.hpp +++ b/SU2_CFD/include/solvers/CFEASolver.hpp @@ -641,6 +641,7 @@ class CFEASolver : public CSolver { * \param[in] config - Configuration of the problem. */ void PredictStruct_Displacement(CGeometry *geometry, CConfig *config) final; + void PredictStruct_Velocity(CGeometry *geometry, CConfig *config) final; /*! * \brief Computation of Aitken's coefficient. diff --git a/SU2_CFD/include/solvers/CFVMFlowSolverBase.inl b/SU2_CFD/include/solvers/CFVMFlowSolverBase.inl index f383142410eb..f18647b9b33e 100644 --- a/SU2_CFD/include/solvers/CFVMFlowSolverBase.inl +++ b/SU2_CFD/include/solvers/CFVMFlowSolverBase.inl @@ -1301,7 +1301,7 @@ void CFVMFlowSolverBase::Pressure_Forces(const CGeometry* geometr RefTemp = Temperature_Inf; RefDensity = Density_Inf; - if (dynamic_grid && !config->GetFSI_Simulation()) { + if (dynamic_grid && !config->GetMultizone_Problem()) { Mach2Vel = sqrt(Gamma * Gas_Constant * RefTemp); Mach_Motion = config->GetMach_Motion(); RefVel2 = (Mach_Motion * Mach2Vel) * (Mach_Motion * Mach2Vel); diff --git a/SU2_CFD/include/solvers/CSolver.hpp b/SU2_CFD/include/solvers/CSolver.hpp index a78ba4cee1ec..57bf06ca33ec 100644 --- a/SU2_CFD/include/solvers/CSolver.hpp +++ b/SU2_CFD/include/solvers/CSolver.hpp @@ -3514,6 +3514,8 @@ class CSolver { */ inline virtual void PredictStruct_Displacement(CGeometry *geometry, CConfig *config) { } + inline virtual void PredictStruct_Velocity(CGeometry *geometry, + CConfig *config) { } /*! * \brief A virtual member. diff --git a/SU2_CFD/include/variables/CFEAVariable.hpp b/SU2_CFD/include/variables/CFEAVariable.hpp index 8f39e72dfa04..0e94a7f0185e 100644 --- a/SU2_CFD/include/variables/CFEAVariable.hpp +++ b/SU2_CFD/include/variables/CFEAVariable.hpp @@ -52,6 +52,7 @@ class CFEAVariable : public CVariable { MatrixType Solution_Accel_time_n; /*!< \brief Acceleration of the nodes at time n. */ MatrixType Solution_Pred; /*!< \brief Predictor of the solution for FSI purposes */ + MatrixType Solution_Vel_Pred; MatrixType Solution_Pred_Old; /*!< \brief Predictor of the solution at time n for FSI purposes */ MatrixType Reference_Geometry; /*!< \brief Reference solution for optimization problems */ @@ -269,6 +270,9 @@ class CFEAVariable : public CVariable { inline void SetSolution_Pred(unsigned long iPoint) final { for (unsigned long iVar = 0; iVar < nVar; iVar++) Solution_Pred(iPoint,iVar) = Solution(iPoint,iVar); } + inline void SetSolution_Vel_Pred(unsigned long iPoint) final { + for (unsigned long iVar = 0; iVar < nVar; iVar++) Solution_Vel_Pred(iPoint,iVar) = Solution_Vel(iPoint,iVar); + } /*! * \brief Set the value of the old solution. @@ -277,6 +281,9 @@ class CFEAVariable : public CVariable { inline void SetSolution_Pred(unsigned long iPoint, const su2double *val_solution_pred) final { for (unsigned long iVar = 0; iVar < nVar; iVar++) Solution_Pred(iPoint,iVar) = val_solution_pred[iVar]; } + inline void SetSolution_Vel_Pred(unsigned long iPoint, const su2double *val_solution_pred) final { + for (unsigned long iVar = 0; iVar < nVar; iVar++) Solution_Vel_Pred(iPoint,iVar) = val_solution_pred[iVar]; + } /*! * \brief Set the value of the predicted solution. @@ -286,6 +293,9 @@ class CFEAVariable : public CVariable { inline void SetSolution_Pred(unsigned long iPoint, unsigned long iVar, su2double val_solution_pred) final { Solution_Pred(iPoint,iVar) = val_solution_pred; } + inline void SetSolution_Vel_Pred(unsigned long iPoint, unsigned long iVar, su2double val_solution_pred) final { + Solution_Vel_Pred(iPoint,iVar) = val_solution_pred; + } /*! * \brief Get the value of the solution predictor. @@ -293,12 +303,14 @@ class CFEAVariable : public CVariable { * \return Pointer to the old solution vector. */ inline su2double GetSolution_Pred(unsigned long iPoint, unsigned long iVar) const final { return Solution_Pred(iPoint,iVar); } + inline su2double GetSolution_Vel_Pred(unsigned long iPoint, unsigned long iVar) const final { return Solution_Vel_Pred(iPoint,iVar); } /*! * \brief Get the solution at time n. * \return Pointer to the solution (at time n) vector. */ inline su2double *GetSolution_Pred(unsigned long iPoint) final { return Solution_Pred[iPoint]; } + inline su2double *GetSolution_Vel_Pred(unsigned long iPoint) final { return Solution_Vel_Pred[iPoint]; } /*! * \brief Set the value of the solution predictor. diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index ed7c3d541c38..dc794e07122d 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -2300,18 +2300,21 @@ class CVariable { * \brief A virtual member. Set the value of the solution predictor. */ inline virtual void SetSolution_Pred(unsigned long iPoint) {} + inline virtual void SetSolution_Vel_Pred(unsigned long iPoint) {} /*! * \brief A virtual member. Set the value of the old solution. * \param[in] solution_pred - Pointer to the residual vector. */ inline virtual void SetSolution_Pred(unsigned long iPoint, const su2double *solution_pred) {} + inline virtual void SetSolution_Vel_Pred(unsigned long iPoint, const su2double *solution_pred) {} /*! * \brief A virtual member. Set the value of the solution predicted. * \param[in] solution_old - Pointer to the residual vector. */ inline virtual void SetSolution_Pred(unsigned long iPoint, unsigned long iVar, su2double solution_pred) {} + inline virtual void SetSolution_Vel_Pred(unsigned long iPoint, unsigned long iVar, su2double solution_pred) {} /*! * \brief A virtual member. Get the value of the solution predictor. @@ -2319,12 +2322,14 @@ class CVariable { * \return Pointer to the old solution vector. */ inline virtual su2double GetSolution_Pred(unsigned long iPoint, unsigned long iVar) const { return 0.0; } + inline virtual su2double GetSolution_Vel_Pred(unsigned long iPoint, unsigned long iVar) const { return 0.0; } /*! * \brief A virtual member. Get the solution at time n. * \return Pointer to the solution (at time n) vector. */ inline virtual su2double *GetSolution_Pred(unsigned long iPoint) {return nullptr; } + inline virtual su2double *GetSolution_Vel_Pred(unsigned long iPoint) {return nullptr; } /*! * \brief A virtual member. Set the value of the solution predictor. diff --git a/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp b/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp index 578462ebaf38..db3c08a99d53 100644 --- a/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp +++ b/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp @@ -45,7 +45,7 @@ void CDisplacementsInterface::GetDonor_Variable(CSolver *struct_solution, CGeome Donor_Variable[iVar] = DisplacementDonor[iVar]; if (struct_config->GetTime_Domain()) { - auto VelocityDonor = struct_solution->GetNodes()->GetSolution_Vel(Point_Struct); + auto VelocityDonor = struct_solution->GetNodes()->GetSolution_Vel_Pred(Point_Struct); for (auto iVar = nVar/2; iVar < nVar; iVar++)//Assuming dynamic interface always has nVar = 2*nDim, 2D: 4, 3D: 6 Donor_Variable[iVar] = VelocityDonor[iVar-nVar/2]; } diff --git a/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp b/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp index 306158bcde5f..e2ce1c07b114 100644 --- a/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp +++ b/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp @@ -299,6 +299,7 @@ void CDiscAdjFEAIteration::SetDependencies(CSolver***** solver, CGeometry**** ge bool nonlinear = config[iZone]->GetGeometricConditions() == LARGE_DEFORMATIONS; bool de_effects = config[iZone]->GetDE_Effects() && nonlinear; bool element_based = dir_solver->IsElementBased() && nonlinear; + bool dynamic = config[iZone]->GetTime_Domain(); for (unsigned short iProp = 0; iProp < config[iZone]->GetnElasticityMod(); iProp++) { su2double E = adj_solver->GetVal_Young(iProp); @@ -367,6 +368,7 @@ void CDiscAdjFEAIteration::SetDependencies(CSolver***** solver, CGeometry**** ge if (fsi) { /*--- Set relation between solution and predicted displacements, which are the transferred ones. ---*/ dir_solver->PredictStruct_Displacement(structural_geometry, config[iZone]); + if (dynamic) dir_solver->PredictStruct_Velocity(structural_geometry, config[iZone]); } /*--- MPI dependencies. ---*/ diff --git a/SU2_CFD/src/iteration/CFEAIteration.cpp b/SU2_CFD/src/iteration/CFEAIteration.cpp index e9c2fe5e00aa..d02c03f69c60 100644 --- a/SU2_CFD/src/iteration/CFEAIteration.cpp +++ b/SU2_CFD/src/iteration/CFEAIteration.cpp @@ -206,8 +206,8 @@ void CFEAIteration::Update(COutput* output, CIntegration**** integration, CGeome const su2double Physical_t = (TimeIter + 1) * Physical_dt; if (Physical_t >= config[val_iZone]->GetTotal_DynTime()) integration[val_iZone][val_iInst][FEA_SOL]->SetConvergence(true); - - } else if (fsi) { + } + if (fsi) {//Now also runs ImplicitNewmark_Relaxation for dynamic fsi /*--- For FSI problems, output the relaxed result, which is the one transferred into the fluid domain (for restart * purposes) ---*/ if (config[val_iZone]->GetKind_TimeIntScheme_FEA() == NEWMARK_IMPLICIT) { @@ -223,6 +223,7 @@ void CFEAIteration::Predictor(COutput* output, CIntegration**** integration, CGe CSolver* feaSolver = solver[val_iZone][val_iInst][MESH_0][FEA_SOL]; feaSolver->PredictStruct_Displacement(geometry[val_iZone][val_iInst][MESH_0], config[val_iZone]); + if (config[val_iZone]->GetTime_Domain()) feaSolver->PredictStruct_Velocity(geometry[val_iZone][val_iInst][MESH_0], config[val_iZone]); } void CFEAIteration::Relaxation(COutput* output, CIntegration**** integration, CGeometry**** geometry, diff --git a/SU2_CFD/src/solvers/CFEASolver.cpp b/SU2_CFD/src/solvers/CFEASolver.cpp index c879fc049a6c..03527c9216ec 100644 --- a/SU2_CFD/src/solvers/CFEASolver.cpp +++ b/SU2_CFD/src/solvers/CFEASolver.cpp @@ -2794,6 +2794,19 @@ void CFEASolver::PredictStruct_Displacement(CGeometry *geometry, CConfig *config } +void CFEASolver::PredictStruct_Velocity(CGeometry *geometry, CConfig *config) { + + /*--- To nPointDomain: we need to communicate the predicted solution after setting it. ---*/ + SU2_OMP_PARALLEL_(for schedule(static,omp_chunk_size)) + for (unsigned long iPoint=0; iPoint < nPointDomain; iPoint++) { + nodes->SetSolution_Vel_Pred(iPoint); + } + + InitiateComms(geometry, config, SOLUTION_VEL_PRED); + CompleteComms(geometry, config, SOLUTION_VEL_PRED); + +} + void CFEASolver::ComputeAitken_Coefficient(CGeometry *geometry, CConfig *config, unsigned long iOuterIter) { unsigned long iPoint, iDim; @@ -3313,9 +3326,10 @@ void CFEASolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig *c nodes->SetSolution_Accel(iPoint_Local, iVar, Sol[iVar+2*nVar]); if (!discrete_adjoint) nodes->SetSolution_Accel_time_n(iPoint_Local, iVar, Sol[iVar+2*nVar]); } - if (fluid_structure && !dynamic) { + if (fluid_structure) { nodes->SetSolution_Pred(iPoint_Local, iVar, Sol[iVar]); nodes->SetSolution_Pred_Old(iPoint_Local, iVar, Sol[iVar]); + if (dynamic) nodes->SetSolution_Vel_Pred(iPoint_Local, iVar, Sol[iVar+nVar]); } if (fluid_structure && discrete_adjoint){ nodes->SetSolution_Old(iPoint_Local, iVar, Sol[iVar]); @@ -3344,12 +3358,16 @@ void CFEASolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig *c solver[MESH_0][FEA_SOL]->InitiateComms(geometry[MESH_0], config, SOLUTION_FEA_OLD); solver[MESH_0][FEA_SOL]->CompleteComms(geometry[MESH_0], config, SOLUTION_FEA_OLD); } - if (fluid_structure && !dynamic) { + if (fluid_structure) { solver[MESH_0][FEA_SOL]->InitiateComms(geometry[MESH_0], config, SOLUTION_PRED); solver[MESH_0][FEA_SOL]->CompleteComms(geometry[MESH_0], config, SOLUTION_PRED); solver[MESH_0][FEA_SOL]->InitiateComms(geometry[MESH_0], config, SOLUTION_PRED_OLD); solver[MESH_0][FEA_SOL]->CompleteComms(geometry[MESH_0], config, SOLUTION_PRED_OLD); + if (dynamic) { + solver[MESH_0][FEA_SOL]->InitiateComms(geometry[MESH_0], config, SOLUTION_VEL_PRED); + solver[MESH_0][FEA_SOL]->CompleteComms(geometry[MESH_0], config, SOLUTION_VEL_PRED); + } } /*--- Delete the class memory that is used to load the restart. ---*/ diff --git a/SU2_CFD/src/solvers/CSolver.cpp b/SU2_CFD/src/solvers/CSolver.cpp index dc7d101368ac..c8a00fa522e2 100644 --- a/SU2_CFD/src/solvers/CSolver.cpp +++ b/SU2_CFD/src/solvers/CSolver.cpp @@ -1646,6 +1646,10 @@ void CSolver::GetCommCountAndType(const CConfig* config, COUNT_PER_POINT = nVar*3; MPI_TYPE = COMM_TYPE_DOUBLE; break; + case SOLUTION_VEL_PRED: + COUNT_PER_POINT = nVar; + MPI_TYPE = COMM_TYPE_DOUBLE; + break; case SOLUTION_PRED: COUNT_PER_POINT = nVar; MPI_TYPE = COMM_TYPE_DOUBLE; @@ -1805,6 +1809,10 @@ void CSolver::InitiateComms(CGeometry *geometry, bufDSend[buf_offset+nVar*2+iVar] = base_nodes->GetSolution_Accel_time_n(iPoint, iVar); } break; + case SOLUTION_VEL_PRED: + for (iVar = 0; iVar < nVar; iVar++) + bufDSend[buf_offset+iVar] = base_nodes->GetSolution_Vel_Pred(iPoint, iVar); + break; case SOLUTION_PRED: for (iVar = 0; iVar < nVar; iVar++) bufDSend[buf_offset+iVar] = base_nodes->GetSolution_Pred(iPoint, iVar); @@ -1980,6 +1988,10 @@ void CSolver::CompleteComms(CGeometry *geometry, base_nodes->SetSolution_Accel_time_n(iPoint, iVar, bufDRecv[buf_offset+nVar*2+iVar]); } break; + case SOLUTION_VEL_PRED: + for (iVar = 0; iVar < nVar; iVar++) + base_nodes->SetSolution_Vel_Pred(iPoint, iVar, bufDRecv[buf_offset+iVar]); + break; case SOLUTION_PRED: for (iVar = 0; iVar < nVar; iVar++) base_nodes->SetSolution_Pred(iPoint, iVar, bufDRecv[buf_offset+iVar]); diff --git a/SU2_CFD/src/variables/CFEAVariable.cpp b/SU2_CFD/src/variables/CFEAVariable.cpp index 15f1b3f7a9a3..2cd923e4995f 100644 --- a/SU2_CFD/src/variables/CFEAVariable.cpp +++ b/SU2_CFD/src/variables/CFEAVariable.cpp @@ -80,6 +80,7 @@ CFEAVariable::CFEAVariable(const su2double *val_fea, unsigned long npoint, unsig if (fsi_analysis) { Solution_Pred = Solution; Solution_Pred_Old = Solution; + if (dynamic_analysis) Solution_Vel_Pred = Solution_Vel; } /*--- If we are going to use incremental analysis, we need a way to store the old solution ---*/ From bedc365e4b7ea162fc5a9432ed9f935f48eb57a2 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sun, 4 Oct 2020 22:43:02 +0100 Subject: [PATCH 74/82] missing source term? --- SU2_CFD/include/drivers/CDriver.hpp | 3 ++- SU2_CFD/include/variables/CDiscAdjFEABoundVariable.hpp | 9 +++++++++ SU2_CFD/include/variables/CVariable.hpp | 2 ++ SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp | 3 +++ SU2_CFD/src/variables/CDiscAdjFEABoundVariable.cpp | 1 + 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/SU2_CFD/include/drivers/CDriver.hpp b/SU2_CFD/include/drivers/CDriver.hpp index e8b4ffe3af72..c50b4f333bbf 100644 --- a/SU2_CFD/include/drivers/CDriver.hpp +++ b/SU2_CFD/include/drivers/CDriver.hpp @@ -818,7 +818,8 @@ class CDriver { */ void SetSourceTerm_DispAdjoint(unsigned short iMarker, unsigned long iVertex, passivedouble val_AdjointX, passivedouble val_AdjointY, passivedouble val_AdjointZ); - + void SetSourceTerm_VelAdjoint(unsigned short iMarker, unsigned long iVertex, passivedouble val_AdjointX, + passivedouble val_AdjointY, passivedouble val_AdjointZ); /*! * \brief Get the undeformed mesh coordinates * \param[in] iMarker - Marker identifier. diff --git a/SU2_CFD/include/variables/CDiscAdjFEABoundVariable.hpp b/SU2_CFD/include/variables/CDiscAdjFEABoundVariable.hpp index 8f7d59bab044..f16ef7d78ce5 100644 --- a/SU2_CFD/include/variables/CDiscAdjFEABoundVariable.hpp +++ b/SU2_CFD/include/variables/CDiscAdjFEABoundVariable.hpp @@ -43,6 +43,7 @@ class CDiscAdjFEABoundVariable final : public CDiscAdjFEAVariable { MatrixType FlowTraction_Sens; /*!< \brief Adjoint of the flow tractions. */ MatrixType SourceTerm_DispAdjoint; /*!< \brief Source term applied into the displacement adjoint coming from external solvers. */ + MatrixType SourceTerm_VelAdjoint; CVertexMap VertexMap; /*!< \brief Object that controls accesses to the variables of this class. */ @@ -101,6 +102,10 @@ class CDiscAdjFEABoundVariable final : public CDiscAdjFEAVariable { if (!VertexMap.GetVertexIndex(iPoint)) return; SourceTerm_DispAdjoint(iPoint,iDim) = val; } + inline void SetSourceTerm_VelAdjoint(unsigned long iPoint, unsigned long iDim, su2double val) override { + if (!VertexMap.GetVertexIndex(iPoint)) return; + SourceTerm_VelAdjoint(iPoint,iDim) = val; + } /*! * \brief Get the source term applied into the displacement adjoint coming from external solvers @@ -111,6 +116,10 @@ class CDiscAdjFEABoundVariable final : public CDiscAdjFEAVariable { if (!VertexMap.GetVertexIndex(iPoint)) return 0.0; return SourceTerm_DispAdjoint(iPoint,iDim); } + inline su2double GetSourceTerm_VelAdjoint(unsigned long iPoint, unsigned long iDim) const override { + if (!VertexMap.GetVertexIndex(iPoint)) return 0.0; + return SourceTerm_VelAdjoint(iPoint,iDim); + } /*! * \brief Get whether a node is on the boundary diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index dc794e07122d..45afe99c6457 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -2771,6 +2771,7 @@ class CVariable { * \param[in] val - value of the source term */ virtual void SetSourceTerm_DispAdjoint(unsigned long iPoint, unsigned long iDim, su2double val) { } + virtual void SetSourceTerm_VelAdjoint(unsigned long iPoint, unsigned long iDim, su2double val) { } /*! * \brief Get the source term applied into the displacement adjoint coming from external solvers @@ -2778,5 +2779,6 @@ class CVariable { * \return value of the source term */ virtual su2double GetSourceTerm_DispAdjoint(unsigned long iPoint, unsigned long iDim) const { return 0.0; } + virtual su2double GetSourceTerm_VelAdjoint(unsigned long iPoint, unsigned long iDim) const { return 0.0; } }; diff --git a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp index f4a519b13416..446ef7bacbfd 100644 --- a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp @@ -780,6 +780,9 @@ void CDiscAdjFEASolver::SetAdjoint_Output(CGeometry *geometry, CConfig *config){ } for (iVar = 0; iVar < nVar; iVar++){ Solution_Vel[iVar] = nodes->GetSolution_Vel(iPoint,iVar); + if (deform_mesh){ + Solution_Vel[iVar] += nodes->GetSourceTerm_VelAdjoint(iPoint,iVar); + } } for (iVar = 0; iVar < nVar; iVar++){ Solution[iVar] += nodes->GetDynamic_Derivative_n(iPoint,iVar); diff --git a/SU2_CFD/src/variables/CDiscAdjFEABoundVariable.cpp b/SU2_CFD/src/variables/CDiscAdjFEABoundVariable.cpp index af1a695117e2..c235013d6289 100644 --- a/SU2_CFD/src/variables/CDiscAdjFEABoundVariable.cpp +++ b/SU2_CFD/src/variables/CDiscAdjFEABoundVariable.cpp @@ -47,5 +47,6 @@ void CDiscAdjFEABoundVariable::AllocateBoundaryVariables(CConfig *config) { FlowTraction_Sens.resize(nBoundPt,nDim) = su2double(0.0); SourceTerm_DispAdjoint.resize(nBoundPt,nDim) = su2double(0.0); + SourceTerm_VelAdjoint.resize(nBoundPt,nDim) = su2double(0.0); } From aea76178a63b60ec0da1c70491c27e879d21568d Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 5 Oct 2020 00:32:12 +0100 Subject: [PATCH 75/82] include disc adj solvers for FSI_Problem --- Common/src/CConfig.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Common/src/CConfig.cpp b/Common/src/CConfig.cpp index 0c0e24d5c83f..ea4c0cab06c9 100644 --- a/Common/src/CConfig.cpp +++ b/Common/src/CConfig.cpp @@ -9788,9 +9788,11 @@ void CConfig::SetMultizone(CConfig *driver_config, CConfig **config_container){ case EULER: case NAVIER_STOKES: case RANS: case INC_EULER: case INC_NAVIER_STOKES: case INC_RANS: case NEMO_EULER: case NEMO_NAVIER_STOKES: + case DISC_ADJ_EULER: case DISC_ADJ_NAVIER_STOKES: case DISC_ADJ_RANS: + case DISC_ADJ_INC_EULER: case DISC_ADJ_INC_NAVIER_STOKES: case DISC_ADJ_INC_RANS: fluid_zone = true; break; - case FEM_ELASTICITY: + case FEM_ELASTICITY: case DISC_ADJ_FEM: structural_zone = true; Relaxation = true; break; From 3d73d7b2696bbd543b20ddc54a8e1be0fe59b829 Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 5 Oct 2020 22:49:32 +0100 Subject: [PATCH 76/82] re-add missed structural markers --- Common/src/grid_movement/CVolumetricMovement.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Common/src/grid_movement/CVolumetricMovement.cpp b/Common/src/grid_movement/CVolumetricMovement.cpp index dcc679f62323..b7e5f057fd0c 100644 --- a/Common/src/grid_movement/CVolumetricMovement.cpp +++ b/Common/src/grid_movement/CVolumetricMovement.cpp @@ -312,8 +312,10 @@ void CVolumetricMovement::ComputeSolid_Wall_Distance(CGeometry *geometry, CConfi for(iMarker=0; iMarkerGetnMarker_All(); ++iMarker) { if( (config->GetMarker_All_KindBC(iMarker) == EULER_WALL || config->GetMarker_All_KindBC(iMarker) == HEAT_FLUX) || - (config->GetMarker_All_KindBC(iMarker) == ISOTHERMAL) || - (config->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE)) { + (config->GetMarker_All_KindBC(iMarker) == ISOTHERMAL) || + (config->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE) || + (config->GetMarker_All_KindBC(iMarker) == CLAMPED_BOUNDARY ) || + (config->GetMarker_All_KindBC(iMarker) == LOAD_BOUNDARY )) { nVertex_SolidWall += geometry->GetnVertex(iMarker); } } @@ -331,8 +333,10 @@ void CVolumetricMovement::ComputeSolid_Wall_Distance(CGeometry *geometry, CConfi for (iMarker=0; iMarkerGetnMarker_All(); ++iMarker) { if ( (config->GetMarker_All_KindBC(iMarker) == EULER_WALL || config->GetMarker_All_KindBC(iMarker) == HEAT_FLUX) || - (config->GetMarker_All_KindBC(iMarker) == ISOTHERMAL) || - (config->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE)) { + (config->GetMarker_All_KindBC(iMarker) == ISOTHERMAL) || + (config->GetMarker_All_KindBC(iMarker) == CHT_WALL_INTERFACE) || + (config->GetMarker_All_KindBC(iMarker) == CLAMPED_BOUNDARY ) || + (config->GetMarker_All_KindBC(iMarker) == LOAD_BOUNDARY )) { for (iVertex=0; iVertexGetnVertex(iMarker); ++iVertex) { iPoint = geometry->vertex[iMarker][iVertex]->GetNode(); PointIDs[jj++] = iPoint; From 0de5acc6ecf8133732629e0351eb7a6e444cd7b6 Mon Sep 17 00:00:00 2001 From: cvencro Date: Fri, 9 Oct 2020 18:13:46 +0100 Subject: [PATCH 77/82] missing booleans --- SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp | 4 +++- SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp | 2 +- SU2_CFD/src/iteration/CFEAIteration.cpp | 3 +-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp b/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp index db3c08a99d53..9cddd77e4939 100644 --- a/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp +++ b/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp @@ -44,7 +44,7 @@ void CDisplacementsInterface::GetDonor_Variable(CSolver *struct_solution, CGeome for (auto iVar = 0u; iVar < nVar; iVar++) Donor_Variable[iVar] = DisplacementDonor[iVar]; - if (struct_config->GetTime_Domain()) { + if (struct_config->GetTime_Domain() && !struct_config->GetWrt_Slice()) { auto VelocityDonor = struct_solution->GetNodes()->GetSolution_Vel_Pred(Point_Struct); for (auto iVar = nVar/2; iVar < nVar; iVar++)//Assuming dynamic interface always has nVar = 2*nDim, 2D: 4, 3D: 6 Donor_Variable[iVar] = VelocityDonor[iVar-nVar/2]; @@ -63,9 +63,11 @@ void CDisplacementsInterface::SetTarget_Variable(CSolver *mesh_solver, CGeometry for (auto iVar = 0u; iVar < nVar/2; iVar++) mesh_solver->GetNodes()->SetBound_Disp(Point_Mesh,iVar,Target_Variable[iVar]); + if (!flow_config->GetWrt_Slice()) { /*--- Impose the boundary velocities ---*/ for (auto iVar = nVar/2; iVar < nVar; iVar++) mesh_solver->GetNodes()->SetBound_Vel(Point_Mesh,iVar-nVar/2,Target_Variable[iVar]); + } } } diff --git a/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp b/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp index e2ce1c07b114..b70d992791f3 100644 --- a/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp +++ b/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp @@ -368,7 +368,7 @@ void CDiscAdjFEAIteration::SetDependencies(CSolver***** solver, CGeometry**** ge if (fsi) { /*--- Set relation between solution and predicted displacements, which are the transferred ones. ---*/ dir_solver->PredictStruct_Displacement(structural_geometry, config[iZone]); - if (dynamic) dir_solver->PredictStruct_Velocity(structural_geometry, config[iZone]); + if (dynamic && !config[iZone]->GetWrt_Slice()) dir_solver->PredictStruct_Velocity(structural_geometry, config[iZone]); } /*--- MPI dependencies. ---*/ diff --git a/SU2_CFD/src/iteration/CFEAIteration.cpp b/SU2_CFD/src/iteration/CFEAIteration.cpp index d02c03f69c60..7d218f4102dd 100644 --- a/SU2_CFD/src/iteration/CFEAIteration.cpp +++ b/SU2_CFD/src/iteration/CFEAIteration.cpp @@ -206,8 +206,7 @@ void CFEAIteration::Update(COutput* output, CIntegration**** integration, CGeome const su2double Physical_t = (TimeIter + 1) * Physical_dt; if (Physical_t >= config[val_iZone]->GetTotal_DynTime()) integration[val_iZone][val_iInst][FEA_SOL]->SetConvergence(true); - } - if (fsi) {//Now also runs ImplicitNewmark_Relaxation for dynamic fsi + } else if (fsi) { /*--- For FSI problems, output the relaxed result, which is the one transferred into the fluid domain (for restart * purposes) ---*/ if (config[val_iZone]->GetKind_TimeIntScheme_FEA() == NEWMARK_IMPLICIT) { From 538baa91eebcfd3f83a6adb8396068f70cf8e34b Mon Sep 17 00:00:00 2001 From: cvencro Date: Thu, 5 Nov 2020 23:27:41 +0000 Subject: [PATCH 78/82] temporary output of fea dv sensitivities --- SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp | 61 +++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp index 446ef7bacbfd..e402b49505dd 100644 --- a/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp @@ -879,6 +879,67 @@ void CDiscAdjFEASolver::SetSensitivity(CGeometry *geometry, CSolver **solver, CC } } SetSurface_Sensitivity(geometry, config); + + // Temporary Output + if (config->GetAdvanced_FEAElementBased()) { + if (rank == MASTER_NODE) { + unsigned short iVar; + + /*--- Header of the temporary adjoint output file ---*/ + ofstream myfile_res; + myfile_res.open("Results_Reverse_Adjoint.txt", ios::app); + myfile_res.precision(15); + myfile_res << config->GetTimeIter() << "\t"; + switch (config->GetKind_ObjFunc()) { + case REFERENCE_NODE: + myfile_res << scientific << direct_solver->GetTotal_OFRefNode() << "\t"; + break; + default: + myfile_res << scientific << 0.0 << "\t"; + break; + } + for (iVar = 0; iVar < nMPROP; iVar++) + myfile_res << scientific << Total_Sens_E[iVar] << "\t"; + for (iVar = 0; iVar < nDV; iVar++) { + myfile_res << scientific << Total_Sens_DV[iVar] << "\t"; + } + myfile_res << endl; + myfile_res.close(); + + + /*--- Header of the temporary dv sensitivity output file ---*/ + ofstream myfile2_res; + bool outputDVFEA = false; + + switch (config->GetDV_FEA()) { + case YOUNG_MODULUS: + myfile2_res.open("grad_young.opt"); + outputDVFEA = true; + break; + default: + outputDVFEA = false; + break; + } + + if (outputDVFEA) { + unsigned short iDV; + + myfile2_res << "INDEX" + << "\t" + << "GRAD" << endl; + + myfile2_res.precision(15); + + for (iDV = 0; iDV < nDV; iDV++) { + myfile2_res << iDV; + myfile2_res << "\t"; + myfile2_res << scientific << Total_Sens_DV[iDV]; + myfile2_res << endl; + } + } + myfile2_res.close(); + } + } } void CDiscAdjFEASolver::SetSurface_Sensitivity(CGeometry *geometry, CConfig *config){ From ec563b8fdb657e2a86d010c12d8b36474818cc50 Mon Sep 17 00:00:00 2001 From: cvencro Date: Sat, 21 Nov 2020 12:03:52 +0000 Subject: [PATCH 79/82] set default using generic time domain criteria --- Common/src/CConfig.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Common/src/CConfig.cpp b/Common/src/CConfig.cpp index ea4c0cab06c9..0d1d5ba195d8 100644 --- a/Common/src/CConfig.cpp +++ b/Common/src/CConfig.cpp @@ -4859,7 +4859,8 @@ void CConfig::SetPostprocessing(unsigned short val_software, unsigned short val_ } /*--- If the averaging interval is not set, we average over all time-steps ---*/ - + } + if (Time_Domain) { if (Iter_Avg_Objective == 0.0) { Iter_Avg_Objective = nTimeIter; } From 50b6be3fccfa16545b57906da9c98e96dbb540ed Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 23 Nov 2020 11:47:37 +0000 Subject: [PATCH 80/82] update grid velocity transfer and non-dimensionalization --- SU2_CFD/src/solvers/CFEASolver.cpp | 4 ++++ SU2_CFD/src/solvers/CMeshSolver.cpp | 4 ++++ SU2_CFD/src/solvers/CSolver.cpp | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/SU2_CFD/src/solvers/CFEASolver.cpp b/SU2_CFD/src/solvers/CFEASolver.cpp index 03527c9216ec..7170d87d52af 100644 --- a/SU2_CFD/src/solvers/CFEASolver.cpp +++ b/SU2_CFD/src/solvers/CFEASolver.cpp @@ -2916,6 +2916,10 @@ void CFEASolver::SetAitken_Relaxation(CGeometry *geometry, CConfig *config) { /*--- Set calculated solution as the old solution (needed for dynamic Aitken relaxation) ---*/ nodes->SetSolution_Old(iPoint, dispCalc); + /*--- Set predicted velocity to update in multizone iterations ---*/ + + if (config->GetTime_Domain()) nodes->SetSolution_Vel_Pred(iPoint); + /*--- Apply the Aitken relaxation ---*/ for (unsigned short iDim=0; iDim < nDim; iDim++) { dispPred[iDim] = (1.0 - WAitken)*dispPred[iDim] + WAitken*dispCalc[iDim]; diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index dc062ba5896b..defd7e2179b1 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -601,6 +601,10 @@ void CMeshSolver::ComputeGridVelocity_FromBoundary(CGeometry **geometry, CNumeri for (unsigned long iPoint = 0; iPoint < nPointDomain; iPoint++) { for (unsigned short iDim = 0; iDim < nDim; iDim++) { su2double val_vel = LinSysSol(iPoint, iDim); + + /*--- Non-dimensionalize velocity ---*/ + val_vel = val_vel/config->GetVelocity_Ref(); + geometry[MESH_0]->nodes->SetGridVel(iPoint, iDim, val_vel); } } diff --git a/SU2_CFD/src/solvers/CSolver.cpp b/SU2_CFD/src/solvers/CSolver.cpp index c8a00fa522e2..51dacc70a58c 100644 --- a/SU2_CFD/src/solvers/CSolver.cpp +++ b/SU2_CFD/src/solvers/CSolver.cpp @@ -1655,7 +1655,7 @@ void CSolver::GetCommCountAndType(const CConfig* config, MPI_TYPE = COMM_TYPE_DOUBLE; break; case SOLUTION_PRED_OLD: - COUNT_PER_POINT = nVar*3; + COUNT_PER_POINT = nVar*4; MPI_TYPE = COMM_TYPE_DOUBLE; break; case AUXVAR_GRADIENT: @@ -1822,6 +1822,7 @@ void CSolver::InitiateComms(CGeometry *geometry, bufDSend[buf_offset+iVar] = base_nodes->GetSolution_Old(iPoint, iVar); bufDSend[buf_offset+nVar+iVar] = base_nodes->GetSolution_Pred(iPoint, iVar); bufDSend[buf_offset+nVar*2+iVar] = base_nodes->GetSolution_Pred_Old(iPoint, iVar); + bufDSend[buf_offset+nVar*3+iVar] = base_nodes->GetSolution_Vel_Pred(iPoint, iVar); } break; case MESH_DISPLACEMENTS: @@ -2001,6 +2002,7 @@ void CSolver::CompleteComms(CGeometry *geometry, base_nodes->SetSolution_Old(iPoint, iVar, bufDRecv[buf_offset+iVar]); base_nodes->SetSolution_Pred(iPoint, iVar, bufDRecv[buf_offset+nVar+iVar]); base_nodes->SetSolution_Pred_Old(iPoint, iVar, bufDRecv[buf_offset+nVar*2+iVar]); + base_nodes->SetSolution_Vel_Pred(iPoint, iVar, bufDRecv[buf_offset+nVar*3+iVar]); } break; case MESH_DISPLACEMENTS: From 186c566f48d9c9b37af7caf9304f5378a973087d Mon Sep 17 00:00:00 2001 From: cvencro Date: Mon, 30 Nov 2020 12:36:33 +0000 Subject: [PATCH 81/82] missed time domain checks --- SU2_CFD/src/solvers/CSolver.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/SU2_CFD/src/solvers/CSolver.cpp b/SU2_CFD/src/solvers/CSolver.cpp index 51dacc70a58c..8b21ba7f8465 100644 --- a/SU2_CFD/src/solvers/CSolver.cpp +++ b/SU2_CFD/src/solvers/CSolver.cpp @@ -1655,7 +1655,10 @@ void CSolver::GetCommCountAndType(const CConfig* config, MPI_TYPE = COMM_TYPE_DOUBLE; break; case SOLUTION_PRED_OLD: - COUNT_PER_POINT = nVar*4; + if (config->GetTime_Domain()) + COUNT_PER_POINT = nVar*4; + else + COUNT_PER_POINT = nVar*3; MPI_TYPE = COMM_TYPE_DOUBLE; break; case AUXVAR_GRADIENT: @@ -1822,7 +1825,8 @@ void CSolver::InitiateComms(CGeometry *geometry, bufDSend[buf_offset+iVar] = base_nodes->GetSolution_Old(iPoint, iVar); bufDSend[buf_offset+nVar+iVar] = base_nodes->GetSolution_Pred(iPoint, iVar); bufDSend[buf_offset+nVar*2+iVar] = base_nodes->GetSolution_Pred_Old(iPoint, iVar); - bufDSend[buf_offset+nVar*3+iVar] = base_nodes->GetSolution_Vel_Pred(iPoint, iVar); + if (config->GetTime_Domain()) + bufDSend[buf_offset+nVar*3+iVar] = base_nodes->GetSolution_Vel_Pred(iPoint, iVar); } break; case MESH_DISPLACEMENTS: @@ -2002,7 +2006,8 @@ void CSolver::CompleteComms(CGeometry *geometry, base_nodes->SetSolution_Old(iPoint, iVar, bufDRecv[buf_offset+iVar]); base_nodes->SetSolution_Pred(iPoint, iVar, bufDRecv[buf_offset+nVar+iVar]); base_nodes->SetSolution_Pred_Old(iPoint, iVar, bufDRecv[buf_offset+nVar*2+iVar]); - base_nodes->SetSolution_Vel_Pred(iPoint, iVar, bufDRecv[buf_offset+nVar*3+iVar]); + if (config->GetTime_Domain()) + base_nodes->SetSolution_Vel_Pred(iPoint, iVar, bufDRecv[buf_offset+nVar*3+iVar]); } break; case MESH_DISPLACEMENTS: From faf0337da9d211235a9c1d7c852326553ced2d75 Mon Sep 17 00:00:00 2001 From: cvencro Date: Tue, 19 Jan 2021 18:36:51 +0000 Subject: [PATCH 82/82] remove temporary booleans --- .../interfaces/fsi/CDisplacementsInterface.cpp | 5 +---- SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp | 2 +- SU2_CFD/src/solvers/CMeshSolver.cpp | 18 +++++------------- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp b/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp index 9cddd77e4939..9a9d28a8be21 100644 --- a/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp +++ b/SU2_CFD/src/interfaces/fsi/CDisplacementsInterface.cpp @@ -44,7 +44,7 @@ void CDisplacementsInterface::GetDonor_Variable(CSolver *struct_solution, CGeome for (auto iVar = 0u; iVar < nVar; iVar++) Donor_Variable[iVar] = DisplacementDonor[iVar]; - if (struct_config->GetTime_Domain() && !struct_config->GetWrt_Slice()) { + if (struct_config->GetTime_Domain()) { auto VelocityDonor = struct_solution->GetNodes()->GetSolution_Vel_Pred(Point_Struct); for (auto iVar = nVar/2; iVar < nVar; iVar++)//Assuming dynamic interface always has nVar = 2*nDim, 2D: 4, 3D: 6 Donor_Variable[iVar] = VelocityDonor[iVar-nVar/2]; @@ -63,11 +63,8 @@ void CDisplacementsInterface::SetTarget_Variable(CSolver *mesh_solver, CGeometry for (auto iVar = 0u; iVar < nVar/2; iVar++) mesh_solver->GetNodes()->SetBound_Disp(Point_Mesh,iVar,Target_Variable[iVar]); - if (!flow_config->GetWrt_Slice()) { /*--- Impose the boundary velocities ---*/ for (auto iVar = nVar/2; iVar < nVar; iVar++) mesh_solver->GetNodes()->SetBound_Vel(Point_Mesh,iVar-nVar/2,Target_Variable[iVar]); - } } - } diff --git a/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp b/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp index b70d992791f3..e2ce1c07b114 100644 --- a/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp +++ b/SU2_CFD/src/iteration/CDiscAdjFEAIteration.cpp @@ -368,7 +368,7 @@ void CDiscAdjFEAIteration::SetDependencies(CSolver***** solver, CGeometry**** ge if (fsi) { /*--- Set relation between solution and predicted displacements, which are the transferred ones. ---*/ dir_solver->PredictStruct_Displacement(structural_geometry, config[iZone]); - if (dynamic && !config[iZone]->GetWrt_Slice()) dir_solver->PredictStruct_Velocity(structural_geometry, config[iZone]); + if (dynamic) dir_solver->PredictStruct_Velocity(structural_geometry, config[iZone]); } /*--- MPI dependencies. ---*/ diff --git a/SU2_CFD/src/solvers/CMeshSolver.cpp b/SU2_CFD/src/solvers/CMeshSolver.cpp index defd7e2179b1..e32bc33380c2 100644 --- a/SU2_CFD/src/solvers/CMeshSolver.cpp +++ b/SU2_CFD/src/solvers/CMeshSolver.cpp @@ -515,16 +515,8 @@ void CMeshSolver::DeformMesh(CGeometry **geometry, CNumerics **numerics, CConfig /*--- The Grid Velocity is only computed if the problem is time domain ---*/ if (time_domain) { - if (config->GetQCR()) {//Test with boolean to disable grid velocity calculation - //SA_QCR= YES: Include Grid Velocity - //SA_QCR= NO: Zero Grid Velocity - - //Test with unused boolean to switch between grid velocity computations - //WRT_SLICE = YES: FD Grid velocity - //WRT_SLICE = NO: Boundary grid velocity - if (config->GetWrt_Slice()) ComputeGridVelocity(geometry[MESH_0], config); - else ComputeGridVelocity_FromBoundary(geometry, numerics, config); - } + if (config->GetFSI_Simulation()) ComputeGridVelocity_FromBoundary(geometry, numerics, config); + else ComputeGridVelocity(geometry[MESH_0], config); } /*--- Update the multigrid structure. ---*/ @@ -845,7 +837,7 @@ void CMeshSolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig * su2double displ = curr_coord - nodes->GetMesh_Coord(iPoint_Local, iDim); nodes->SetSolution(iPoint_Local, iDim, displ); su2double vel = Restart_Data[index+iDim+6]; - if (time_domain && !config->GetWrt_Slice() && config->GetQCR()) geometry[MESH_0]->nodes->SetGridVel(iPoint_Local, iDim, Restart_Data[index+iDim+6]); + if (time_domain && config->GetFSI_Simulation()) geometry[MESH_0]->nodes->SetGridVel(iPoint_Local, iDim, Restart_Data[index+iDim+6]); } /*--- Increment the overall counter for how many points have been loaded. ---*/ @@ -881,12 +873,12 @@ void CMeshSolver::LoadRestart(CGeometry **geometry, CSolver ***solver, CConfig * UpdateDualGrid(geometry[MESH_0], config); /*--- For time-domain problems, we need to compute the grid velocities ---*/ - if (time_domain && config->GetWrt_Slice()){ + if (time_domain && !config->GetFSI_Simulation()){ /*--- Update the old geometry (coordinates n and n-1) ---*/ Restart_OldGeometry(geometry[MESH_0], config); /*--- Once Displacement_n and Displacement_n1 are filled, we can compute the Grid Velocity ---*/ - if (config->GetQCR()) ComputeGridVelocity(geometry[MESH_0], config); + ComputeGridVelocity(geometry[MESH_0], config); } /*--- Update the multigrid structure after setting up the finest grid,