Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add elastic inversion capability using batch materials #353

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
###############################################################################
#
# Optional Environment variables
# MOOSE_DIR - Root directory of the MOOSE project
# MOOSE_DIR - Root directory of the MOOSE project
#
###############################################################################
# Use the MOOSE submodule if it exists and MOOSE_DIR is not set
Expand Down Expand Up @@ -40,6 +40,7 @@ TENSOR_MECHANICS := yes
WATER_STEAM_EOS := no
XFEM := yes
POROUS_FLOW := no
OPTIMIZATION := yes

include $(MOOSE_DIR)/modules/modules.mk
###############################################################################
Expand Down
3 changes: 3 additions & 0 deletions doc/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ Content:
root_dir: ${MOOSE_DIR}/modules/stochastic_tools/doc/content
ray_tracing:
root_dir: ${MOOSE_DIR}/modules/ray_tracing/doc/content
optimization:
root_dir: ${MOOSE_DIR}/modules/optimization/doc/content

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add this to the modules:/content: list below:

          - help/development/analyze_jacobian.md

modules:
root_dir: ${MOOSE_DIR}/modules/doc/content
content:
Expand Down Expand Up @@ -83,6 +85,7 @@ Extensions:
misc: !include ${MOOSE_DIR}/modules/misc/doc/sqa_misc.yml
xfem: !include ${MOOSE_DIR}/modules/xfem/doc/sqa_xfem.yml
ray_tracing: !include ${MOOSE_DIR}/modules/ray_tracing/doc/sqa_ray_tracing.yml
optimization: !include ${MOOSE_DIR}/modules/optimization/doc/sqa_optimization.yml

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add this to enable the algorithm extension:

  MooseDocs.extensions.algorithm:
      active: True

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool! Thanks Zach!

blackbear: !include ${ROOT_DIR}/doc/sqa_blackbear.yml
requirement-groups:
dgkernels: DGKernel Objects
Expand Down
22 changes: 22 additions & 0 deletions doc/content/source/userobjects/BatchStressGrad.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# BatchStressGrad

## Description

This `UserObject` computes double contraction of the elastic tensor derivative and the forward mechanical strain, i.e.,
\begin{equation}
\underbrace{\frac{\partial \boldsymbol{C}}{\partial p}}_{\text{elastic tensor derivative}} \underbrace{(\boldsymbol{L} u)}_{\text{forward strain}}
\end{equation}
as a batch material.
Here, the $\boldsymbol{C}$ is the elastic tensor, $p$ is the interested parameter, $\boldsymbol{L}$ is the differential operator for elasticity problem, and $\boldsymbol{L} u$ is strain from the forward problem. This object requires the elastic tensor derivative material property (i.e., $\frac{\partial \boldsymbol{C}}{\partial p}$) as its input.
dewenyushu marked this conversation as resolved.
Show resolved Hide resolved

This object is used together with [AdjointStrainStressGradInnerProduct](/AdjointStrainStressGradInnerProduct.md) in a elastic inversion problem.
dewenyushu marked this conversation as resolved.
Show resolved Hide resolved

## Example Input File Syntax

!listing test/tests/bimaterial_elastic_inversion_batch_mat/grad.i block=UserObjects/stress_grad_lambda

!syntax parameters /UserObjects/BatchStressGrad

!syntax inputs /UserObjects/BatchStressGrad

!syntax children /UserObjects/BatchStressGrad
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# AdjointStrainStressGradInnerProduct

!syntax description /VectorPostprocessors/AdjointStrainStressGradInnerProduct

## Description

This `VectorPostprocessor` computes the gradient of objective function with respect to interested parameter for elastic problem. Specifically,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First state the objective function please.

\begin{equation}
\frac{\text{d}\boldsymbol{F}}{\text{d}p} = - \int \underbrace{(\boldsymbol{L}\lambda)^T}_{\text{adjoint strain}} \underbrace{\frac{\partial \boldsymbol{C}}{\partial p} (\boldsymbol{L} u)}_{\text{stress gradient}} \text{d}\Omega,
\end{equation}
where $\boldsymbol{F}$ is the objective function, $\boldsymbol{L}$ is the differential operator for the elasticity problem, $\lambda$ is the adjoint displacement, $\boldsymbol{C}$ is the elastic tensor, $p$ is the interested parameter, and $u$ is displacement from the forward problem.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
where $\boldsymbol{F}$ is the objective function, $\boldsymbol{L}$ is the differential operator for the elasticity problem, $\lambda$ is the adjoint displacement, $\boldsymbol{C}$ is the elastic tensor, $p$ is the interested parameter, and $u$ is displacement from the forward problem.
where $\boldsymbol{F}$ is the objective function, $\boldsymbol{L}$ is the symmetric strain operator for the elasticity problem, $\lambda$ is the adjoint displacement, $\boldsymbol{C}$ is the elasticity tensor, $p$ is the interested parameter, and $u$ is displacement from the forward problem.

It's not clear to me from this description whether p should be a scalar-valued property or can be vector-valued (or a set of scalar-valued properties). I guess I can find out in the actual source codes...


Specifically, this object takes the `adjoint strain` and the `stress gradient` as inputs, computes the double contraction of the two inputs, and integrate over the entire domain. Specifically, the `adjoint strain` is the strain from the adjoint problem, the `stress gradient` should be a batch material (e.g., [BatchStressGrad](/BatchStressGrad.md)).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I get a heart attack every time I see "stress gradient", but then later realize that you really mean the derivative of stress w.r.t. the the parameters which is an entirely different story.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Haha, sorry about the confusion. Yeah I meant the gradient of stress wrt to the interested parameter here but wanted it to be concise. I'll use gradient of stress w.r.t. parameter to hopefully avoid further confusion.


## Example Input File Syntax

!listing test/tests/bimaterial_elastic_inversion_batch_mat/grad.i block=VectorPostprocessors/grad_lambda

!syntax parameters /VectorPostprocessors/AdjointStrainStressGradInnerProduct

!syntax inputs /VectorPostprocessors/AdjointStrainStressGradInnerProduct

!syntax children /VectorPostprocessors/AdjointStrainStressGradInnerProduct
33 changes: 33 additions & 0 deletions include/userobjects/BatchStressGrad.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//* This file is part of the MOOSE framework
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These files will all need the BlackBear header

//* https://www.mooseframework.org
//*
//* All rights reserved, see COPYRIGHT for full restrictions
//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
//*
//* Licensed under LGPL 2.1, please see LICENSE for details
//* https://www.gnu.org/licenses/lgpl-2.1.html

#pragma once

#include "BatchMaterial.h"

typedef BatchMaterial<
// tuple representation
BatchMaterialUtils::TupleStd,
// output data type
RankTwoTensor,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So... this implies that p is a scalar-valued property. This is fine for now.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When is p not scalar valued?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We will need multiple such objects for each p component for that case

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ya, as Dewen said we need multiple instances of the object to calculate the derivatives w.r.t. each p, for example we need two objects for the two Lame parameters (more when the stress-strain relation has more parameters). I feel like there will be an overhead in doing this. But I'm not sure how much that overhead will cost us.

// gathered input data types:
BatchMaterialUtils::GatherMatProp<RankFourTensor>,
BatchMaterialUtils::GatherMatProp<RankTwoTensor>>

BatchStressGradParent;

class BatchStressGrad : public BatchStressGradParent
{
public:
static InputParameters validParams();

BatchStressGrad(const InputParameters & params);

void batchCompute() override;
};
31 changes: 31 additions & 0 deletions include/vectorpostprocessors/AdjointStrainStressGradInnerProduct.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//* This file is part of the MOOSE framework
//* https://www.mooseframework.org
//*
//* All rights reserved, see COPYRIGHT for full restrictions
//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
//*
//* Licensed under LGPL 2.1, please see LICENSE for details
//* https://www.gnu.org/licenses/lgpl-2.1.html

#pragma once

#include "ElementOptimizationFunctionInnerProduct.h"
#include "BatchStressGrad.h"

class AdjointStrainStressGradInnerProduct : public ElementOptimizationFunctionInnerProduct
{
public:
static InputParameters validParams();

AdjointStrainStressGradInnerProduct(const InputParameters & parameters);

protected:
virtual Real computeQpInnerProduct() override;
/// Base name of the material system
const std::string _base_name;
/// Holds adjoint strain at current quadrature points
const MaterialProperty<RankTwoTensor> & _adjoint_strain;
/// UO that holds gradient of stress wrt material parameter at current quadrature points
const BatchStressGrad & _stress_grad_uo;
const BatchStressGrad::OutputVector & _stress_grad_uo_output;
};
46 changes: 46 additions & 0 deletions src/userobjects/BatchStressGrad.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//* This file is part of the MOOSE framework
//* https://www.mooseframework.org
//*
//* All rights reserved, see COPYRIGHT for full restrictions
//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
//*
//* Licensed under LGPL 2.1, please see LICENSE for details
//* https://www.gnu.org/licenses/lgpl-2.1.html

#include "BatchStressGrad.h"
#include "libmesh/int_range.h"

registerMooseObject("BlackBearApp", BatchStressGrad);

InputParameters
BatchStressGrad::validParams()
{
auto params = BatchStressGradParent::validParams();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will you add a addClassDescription? Or is this going to be a test/src object?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. Just did!

params.addRequiredParam<MaterialPropertyName>(
"elastic_tensor_derivative", "Name of the elastic tensor derivative material property.");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"elastic_tensor_derivative", "Name of the elastic tensor derivative material property.");
"elasticity_tensor_derivative", "Name of the elasticity tensor derivative material property.");

here and a few other places: there's no such a thing called elastic tensor.

return params;
}

BatchStressGrad::BatchStressGrad(const InputParameters & params)
: BatchStressGradParent(params,
// here we pass the derivative of elastic tensor wrt to the parameter
"elastic_tensor_derivative",
// here we pass in the forward strain
"forward_mechanical_strain")
{
}

void
BatchStressGrad::batchCompute()
{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps a comment here or in the header stating that this is a placeholder until we can swap this out for "actually" batched computation.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, will do!

for (const auto i : index_range(_input_data))
{
const auto & input = _input_data[i];
auto & output = _output_data[i];

const auto & elasticity_dev = std::get<0>(input);
const auto & strain = std::get<1>(input);

output = elasticity_dev * strain;
}
}
48 changes: 48 additions & 0 deletions src/vectorpostprocessors/AdjointStrainStressGradInnerProduct.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//* This file is part of the MOOSE framework
//* https://www.mooseframework.org
//*
//* All rights reserved, see COPYRIGHT for full restrictions
//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
//*
//* Licensed under LGPL 2.1, please see LICENSE for details
//* https://www.gnu.org/licenses/lgpl-2.1.html

#include "AdjointStrainStressGradInnerProduct.h"

registerMooseObject("BlackBearApp", AdjointStrainStressGradInnerProduct);

InputParameters
AdjointStrainStressGradInnerProduct::validParams()
{
InputParameters params = ElementOptimizationFunctionInnerProduct::validParams();
params.addRequiredParam<UserObjectName>(
"stress_grad_name",
"Name of the stress gradient user object with respect to the material parameter");

params.addRequiredParam<MaterialPropertyName>(
"adjoint_strain_name", "Name of the strain property in the adjoint problem");

params.addClassDescription("Compute the gradient for elastic material inversion");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
params.addClassDescription("Compute the gradient for elastic material inversion");
params.addClassDescription("Compute the parameter gradient for linear elastic material inversion");

return params;
}
AdjointStrainStressGradInnerProduct::AdjointStrainStressGradInnerProduct(
const InputParameters & parameters)
: ElementOptimizationFunctionInnerProduct(parameters),
_base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
_adjoint_strain(getMaterialPropertyByName<RankTwoTensor>(
getParam<MaterialPropertyName>("adjoint_strain_name"))),
_stress_grad_uo(getUserObject<BatchStressGrad>("stress_grad_name")),
_stress_grad_uo_output(_stress_grad_uo.getOutputData())
{
}

Real
AdjointStrainStressGradInnerProduct::computeQpInnerProduct()
{
if (!_stress_grad_uo.outputReady())
mooseError("Stress gradient batch material property is not ready to output.");

const auto index = _stress_grad_uo.getIndex(_current_elem->id());

return -_adjoint_strain[_qp].doubleContraction(_stress_grad_uo_output[index + _qp]);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
grad_lambda,grad_mu,lambda,measurement_time,measurement_values,measurement_xcoord,measurement_ycoord,measurement_zcoord,misfit_values,mu,simulation_values
5.1698615078396e-11,5.2394323056988e-11,4.9999752463318,0,4.46462,-1,-1,0,9.2479240265675e-08,1.0000001055133,4.4646200924792
5.097187284528e-12,3.5417284419815e-11,4.0000666870441,0,6.447155,-1,0,0,5.2641227377137e-08,2.0000064790597,6.4471550526412
-2.7212788369455e-12,8.6258766757591e-12,2.9997143457064,0,8.434803,-1,1,0,-1.0044113984975e-07,2.9999940961679,8.4348028995589
0,0,0,0,4.176264,0,-1,0,-1.14358395642e-07,0,4.1762638856416
0,0,0,0,6.172984,0,0,0,-1.7726937251439e-07,0,6.1729838227306
0,0,0,0,8.200859,0,1,0,1.9391855410333e-07,0,8.2008591939186
0,0,0,0,4.049477,1,-1,0,2.2853767767117e-08,0,4.0494770228538
0,0,0,0,6.052499,1,0,0,1.1289934853664e-07,0,6.0524991128993
0,0,0,0,8.079385,1,1,0,-8.6613697547477e-08,0,8.0793849133863
Loading