void LiquidFlowProcess::initializeConcreteProcess( NumLib::LocalToGlobalIndexMap const& dof_table, MeshLib::Mesh const& mesh, unsigned const integration_order) { ProcessLib::ProcessVariable const& pv = getProcessVariables()[0]; ProcessLib::createLocalAssemblers<LiquidFlowLocalAssembler>( mesh.getDimension(), mesh.getElements(), dof_table, pv.getShapeFunctionOrder(), _local_assemblers, mesh.isAxiallySymmetric(), integration_order, _gravitational_axis_id, _gravitational_acceleration, _material_properties); _secondary_variables.addSecondaryVariable( "darcy_velocity_x", 1, makeExtrapolator( getExtrapolator(), _local_assemblers, &LiquidFlowLocalAssemblerInterface::getIntPtDarcyVelocityX)); if (mesh.getDimension() > 1) { _secondary_variables.addSecondaryVariable( "darcy_velocity_y", 1, makeExtrapolator( getExtrapolator(), _local_assemblers, &LiquidFlowLocalAssemblerInterface::getIntPtDarcyVelocityY)); } if (mesh.getDimension() > 2) { _secondary_variables.addSecondaryVariable( "darcy_velocity_z", 1, makeExtrapolator( getExtrapolator(), _local_assemblers, &LiquidFlowLocalAssemblerInterface::getIntPtDarcyVelocityZ)); } }
void RichardsComponentTransportProcess::initializeConcreteProcess( NumLib::LocalToGlobalIndexMap const& dof_table, MeshLib::Mesh const& mesh, unsigned const integration_order) { const int monolithic_process_id = 0; ProcessLib::ProcessVariable const& pv = getProcessVariables(monolithic_process_id)[0]; ProcessLib::createLocalAssemblers<LocalAssemblerData>( mesh.getDimension(), mesh.getElements(), dof_table, pv.getShapeFunctionOrder(), _local_assemblers, mesh.isAxiallySymmetric(), integration_order, _process_data); _secondary_variables.addSecondaryVariable( "darcy_velocity", makeExtrapolator(mesh.getDimension(), getExtrapolator(), _local_assemblers, &RichardsComponentTransportLocalAssemblerInterface:: getIntPtDarcyVelocity)); _secondary_variables.addSecondaryVariable( "saturation", makeExtrapolator(1, getExtrapolator(), _local_assemblers, &RichardsComponentTransportLocalAssemblerInterface:: getIntPtSaturation)); }
void HTProcess::initializeConcreteProcess( NumLib::LocalToGlobalIndexMap const& dof_table, MeshLib::Mesh const& mesh, unsigned const integration_order) { // For the staggered scheme, both processes are assumed to use the same // element order. Therefore the order of shape function can be fetched from // any set of the sets of process variables of the coupled processes. Here, // we take the one from the first process by setting process_id = 0. const int process_id = 0; ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; if (_use_monolithic_scheme) { ProcessLib::createLocalAssemblers<MonolithicHTFEM>( mesh.getDimension(), mesh.getElements(), dof_table, pv.getShapeFunctionOrder(), _local_assemblers, mesh.isAxiallySymmetric(), integration_order, *_material_properties); } else { ProcessLib::createLocalAssemblers<StaggeredHTFEM>( mesh.getDimension(), mesh.getElements(), dof_table, pv.getShapeFunctionOrder(), _local_assemblers, mesh.isAxiallySymmetric(), integration_order, *_material_properties, _heat_transport_process_id, _hydraulic_process_id); } _secondary_variables.addSecondaryVariable( "darcy_velocity", makeExtrapolator(mesh.getDimension(), getExtrapolator(), _local_assemblers, &HTLocalAssemblerInterface::getIntPtDarcyVelocity)); }
void PhaseFieldProcess<DisplacementDim>::initializeConcreteProcess( NumLib::LocalToGlobalIndexMap const& dof_table, MeshLib::Mesh const& mesh, unsigned const integration_order) { ProcessLib::SmallDeformation::createLocalAssemblers< DisplacementDim, PhaseFieldLocalAssembler>( mesh.getElements(), dof_table, _local_assemblers, mesh.isAxiallySymmetric(), integration_order, _process_data); _secondary_variables.addSecondaryVariable( "sigma", makeExtrapolator(MathLib::KelvinVector::KelvinVectorType< DisplacementDim>::RowsAtCompileTime, getExtrapolator(), _local_assemblers, &LocalAssemblerInterface::getIntPtSigma)); _secondary_variables.addSecondaryVariable( "epsilon", makeExtrapolator(MathLib::KelvinVector::KelvinVectorType< DisplacementDim>::RowsAtCompileTime, getExtrapolator(), _local_assemblers, &LocalAssemblerInterface::getIntPtEpsilon)); }
void ThermoMechanicsProcess<DisplacementDim>::initializeConcreteProcess( NumLib::LocalToGlobalIndexMap const& dof_table, MeshLib::Mesh const& mesh, unsigned const integration_order) { ProcessLib::SmallDeformation::createLocalAssemblers< DisplacementDim, ThermoMechanicsLocalAssembler>( mesh.getElements(), dof_table, _local_assemblers, mesh.isAxiallySymmetric(), integration_order, _process_data); // TODO move the two data members somewhere else. // for extrapolation of secondary variables std::vector<MeshLib::MeshSubset> all_mesh_subsets_single_component{ *_mesh_subset_all_nodes}; _local_to_global_index_map_single_component.reset( new NumLib::LocalToGlobalIndexMap( std::move(all_mesh_subsets_single_component), // by location order is needed for output NumLib::ComponentOrder::BY_LOCATION)); _secondary_variables.addSecondaryVariable( "sigma", makeExtrapolator( MathLib::KelvinVector::KelvinVectorType< DisplacementDim>::RowsAtCompileTime, getExtrapolator(), _local_assemblers, &ThermoMechanicsLocalAssemblerInterface::getIntPtSigma)); _secondary_variables.addSecondaryVariable( "epsilon", makeExtrapolator( MathLib::KelvinVector::KelvinVectorType< DisplacementDim>::RowsAtCompileTime, getExtrapolator(), _local_assemblers, &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilon)); // Set initial conditions for integration point data. for (auto const& ip_writer : _integration_point_writer) { // Find the mesh property with integration point writer's name. auto const& name = ip_writer->name(); if (!mesh.getProperties().existsPropertyVector<double>(name)) { continue; } auto const& mesh_property = *mesh.getProperties().template getPropertyVector<double>(name); // The mesh property must be defined on integration points. if (mesh_property.getMeshItemType() != MeshLib::MeshItemType::IntegrationPoint) { continue; } auto const ip_meta_data = getIntegrationPointMetaData(mesh, name); // Check the number of components. if (ip_meta_data.n_components != mesh_property.getNumberOfComponents()) { OGS_FATAL( "Different number of components in meta data (%d) than in " "the integration point field data for '%s': %d.", ip_meta_data.n_components, name.c_str(), mesh_property.getNumberOfComponents()); } // Now we have a properly named vtk's field data array and the // corresponding meta data. std::size_t position = 0; for (auto& local_asm : _local_assemblers) { std::size_t const integration_points_read = local_asm->setIPDataInitialConditions( name, &mesh_property[position], ip_meta_data.integration_order); if (integration_points_read == 0) { OGS_FATAL( "No integration points read in the integration point " "initial conditions set function."); } position += integration_points_read * ip_meta_data.n_components; } } }
void SmallDeformationNonlocalProcess<DisplacementDim>:: initializeConcreteProcess(NumLib::LocalToGlobalIndexMap const& dof_table, MeshLib::Mesh const& mesh, unsigned const integration_order) { // Reusing local assembler creation code. ProcessLib::SmallDeformation::createLocalAssemblers< DisplacementDim, SmallDeformationNonlocalLocalAssembler>( mesh.getElements(), dof_table, _local_assemblers, mesh.isAxiallySymmetric(), integration_order, _process_data); // TODO move the two data members somewhere else. // for extrapolation of secondary variables std::vector<MeshLib::MeshSubset> all_mesh_subsets_single_component{ *_mesh_subset_all_nodes}; _local_to_global_index_map_single_component = std::make_unique<NumLib::LocalToGlobalIndexMap>( std::move(all_mesh_subsets_single_component), // by location order is needed for output NumLib::ComponentOrder::BY_LOCATION); Process::_secondary_variables.addSecondaryVariable( "sigma", makeExtrapolator(MathLib::KelvinVector::KelvinVectorType< DisplacementDim>::RowsAtCompileTime, getExtrapolator(), _local_assemblers, &LocalAssemblerInterface::getIntPtSigma)); Process::_secondary_variables.addSecondaryVariable( "epsilon", makeExtrapolator(MathLib::KelvinVector::KelvinVectorType< DisplacementDim>::RowsAtCompileTime, getExtrapolator(), _local_assemblers, &LocalAssemblerInterface::getIntPtEpsilon)); Process::_secondary_variables.addSecondaryVariable( "eps_p_V", makeExtrapolator(1, getExtrapolator(), _local_assemblers, &LocalAssemblerInterface::getIntPtEpsPV)); Process::_secondary_variables.addSecondaryVariable( "eps_p_D_xx", makeExtrapolator(1, getExtrapolator(), _local_assemblers, &LocalAssemblerInterface::getIntPtEpsPDXX)); Process::_secondary_variables.addSecondaryVariable( "damage", makeExtrapolator(1, getExtrapolator(), _local_assemblers, &LocalAssemblerInterface::getIntPtDamage)); GlobalExecutor::executeMemberOnDereferenced( &LocalAssemblerInterface::nonlocal, _local_assemblers, _local_assemblers); // Set initial conditions for integration point data. for (auto const& ip_writer : _integration_point_writer) { auto const& name = ip_writer->name(); // First check the field data, which is used for restart. if (mesh.getProperties().existsPropertyVector<double>(name)) { auto const& mesh_property = *mesh.getProperties().template getPropertyVector<double>(name); // The mesh property must be defined on integration points. if (mesh_property.getMeshItemType() != MeshLib::MeshItemType::IntegrationPoint) { continue; } auto const ip_meta_data = getIntegrationPointMetaData(mesh, name); // Check the number of components. if (ip_meta_data.n_components != mesh_property.getNumberOfComponents()) { OGS_FATAL( "Different number of components in meta data (%d) than in " "the integration point field data for '%s': %d.", ip_meta_data.n_components, name.c_str(), mesh_property.getNumberOfComponents()); } // Now we have a properly named vtk's field data array and the // corresponding meta data. std::size_t position = 0; for (auto& local_asm : _local_assemblers) { std::size_t const integration_points_read = local_asm->setIPDataInitialConditions( name, &mesh_property[position], ip_meta_data.integration_order); if (integration_points_read == 0) { OGS_FATAL( "No integration points read in the integration point " "initial conditions set function."); } position += integration_points_read * ip_meta_data.n_components; } } else if (mesh.getProperties().existsPropertyVector<double>(name + "_ic")) { // Try to find cell data with '_ic' suffix auto const& mesh_property = *mesh.getProperties().template getPropertyVector<double>(name + "_ic"); if (mesh_property.getMeshItemType() != MeshLib::MeshItemType::Cell) { continue; } // Now we have a vtk's cell data array containing the initial // conditions for the corresponding integration point writer. // For each assembler use the single cell value for all // integration points. for (std::size_t i = 0; i < _local_assemblers.size(); ++i) { auto& local_asm = _local_assemblers[i]; std::vector<double> value( &mesh_property[i], &mesh_property[i] + mesh_property.getNumberOfComponents()); // TODO (naumov) Check sizes / read size / etc. // OR reconstruct dimensions from size / component = // ip_points local_asm->setIPDataInitialConditionsFromCellData(name, value); } } } }