Dear Dennis,
Thank you for your response. Implementing binding using couplingManager
solved the issue.

Also, Initially problem was mailed to the dumux mailing list. I should have
replied to all, sorry for that. Thank you for sharing this with me, I'll
keep it in mind.

Regards,
Ranjeet


On Tue, Jan 29, 2019 at 9:55 PM Dennis Gläser <
[email protected]> wrote:

> Dear Ranjeet,
>
> please ask your questions to the mailing list so that other people can
> profit from this discussion, too.
>
> If you implemented your stress output similar to the way as it is done in
> the UNCOUPLED poroelastic test case (which does not use multidomain), then
> it is clear where the error comes from.
>
> Currently, in the multidomain framework, a "coupling context" is
> precomputed prior to element-local calculations. This is done in the
> assembler before starting the assembly of element-local entries in the
> global system matrix. This concept was introduced to speed up the
> computations and it is somewhat similar to what you do with the geometry
> and the volume variables, i.e.:
>
> fvGeometry.bind( ... )
>
> elemVolVars.bind( ... )
>
> For the coupling context the call is done on the coupling manager:
>
> couplingManager.bindCouplingContext(domainId, element, assembler)
>
>
> This precomputes all variables of the other domain that are necessary for
> computations on the element of your current domain. So in your element loop
> of the stress computation you would have to do this call PRIOR to the
> element volume variables bind() call.
>
> We are not happy with this and are currently working on getting rid of the
> necessity of this call. Until then, you will have to pass the assembler to
> your stress computation routine in order to realize the
> bindCouplingContext() call before computing the element stresses. Sorry
> about that!
>
> Let us know if this fixes your problem!
>
> Best wishes,
> Dennis
>
>
>
>
> On 29.01.19 10:25, Timo Koch wrote:
>
>
>
>
> -------- Forwarded Message --------
> Subject: Re: [DuMuX] how to add stresses to output file for
> multidomain-el2p problem
> Date: Tue, 29 Jan 2019 19:52:41 +1100
> From: Ranjeet kumar <[email protected]> <[email protected]>
> To: Timo Koch <[email protected]>
> <[email protected]>
>
> Thank you for the reply.
>
> As per gdb & valgrind, problem seems coming from the:
> const auto effPress = problem.effectivePorePressure(element, fvGeometry,
> elemVolVars, fluxVarsCache); and hence from:
> const auto sigma = StressType::stressTensor(problem, element, fvGeometry,
> elemVolVars, fluxVarsCache);
>
> I have attached the valgrind log file. If you could give some idea to
> solve this, it will be great helpful.
>
>
>
> On Thu, Jan 24, 2019 at 7:18 PM Timo Koch <[email protected]>
> wrote:
>
>> Hi Ranjeet,
>>
>> please use a debugging tool like valgrind to find where your segmentation
>> fault comes from. Maybe then we can help.
>>
>> Timo
>>
>> > Am 24.01.2019 um 08:08 schrieb Ranjeet kumar <[email protected]>:
>> >
>> > Hi All,
>> > I want to add stresses value to the vtu file for the el2p problem.
>> Based on geomechanics/poroselastic/main.cc, I tried to implementing the
>> same for el2p problem. But I getting error segmentation fault error.
>> >
>> > // function to evaluate the element stresses
>> > template< class StressType,
>> >           class Problem,
>> >           class GridGeometry,
>> >           class GridVariables,
>> >           class SolutionVector,
>> >           class SigmaStorage>
>> > void assembleElementStresses(SigmaStorage& sigmaStorage,
>> >                              SigmaStorage& effSigmaStorage,
>> >                              const Problem& problem,
>> >                              const GridGeometry& fvGridGeometry,
>> >                              const GridVariables& gridVariables,
>> >                              const SolutionVector& x)
>> > {
>> >     for (const auto& element : elements(fvGridGeometry.gridView()))
>> >     {
>> >         auto fvGeometry = localView(fvGridGeometry);
>> >         auto elemVolVars = localView(gridVariables.curGridVolVars());
>> >
>> >         fvGeometry.bind(element);
>> >         elemVolVars.bind(element, fvGeometry, x);
>> >
>> >         // evaluate flux variables cache at cell center
>> >         using FluxVarsCache = typename
>> GridVariables::GridFluxVariablesCache::FluxVariablesCache;
>> >         FluxVarsCache fluxVarsCache;
>> >         fluxVarsCache.update(problem, element, fvGeometry, elemVolVars,
>> element.geometry().center());
>> >
>> >         //get lame parameters, the pressure and compute stress tensor
>> >         const auto sigma = StressType::stressTensor(problem, element,
>> fvGeometry, elemVolVars, fluxVarsCache);          // this gives error
>> >         const auto effSigma =
>> StressType::effectiveStressTensor(problem, element, fvGeometry,
>> elemVolVars, fluxVarsCache);
>> >
>> >
>> >         //std::vector<int> v{1,2,3};
>> >         const auto eIdx = fvGridGeometry.elementMapper().index(element);
>> >
>> >         // pass values into storage container
>> >         using FVGridGeometry = typename GridVariables::GridGeometry;
>> >         for (int dir = 0; dir < FVGridGeometry::GridView::dimension;
>> ++dir)
>> >         {
>> >             sigmaStorage[dir][eIdx] = sigma[dir];
>> >             //sigmaStorage[dir][eIdx] = v[dir];    //sigma[dir];
>> >             effSigmaStorage[dir][eIdx] = effSigma[dir];
>> >             //effSigmaStorage[dir][eIdx] = v[dir];   //effSigma[dir];
>> >         }
>> >     }
>> > }
>> >
>> > In main method,
>> >
>> >     //containers to store the sigma
>> >     std::array<std::vector<ForceVector>, dim> sigmaStorage;
>> >     std::array<std::vector<ForceVector>, dim> effSigmaStorage;
>> >     const auto numCells = poroMechFvGridGeometry->gridView().size(0);
>> >     std::for_each(sigmaStorage.begin(), sigmaStorage.end(),
>> [numCells](auto& sigma){sigma.resize(numCells);});
>> >     std::for_each(effSigmaStorage.begin(), effSigmaStorage.end(),
>> [numCells](auto& effSigma){effSigma.resize(numCells);});
>> >
>> >     for (int dir = 0; dir < dim; ++dir)
>> >     {
>> >         poroMechVtkWriter.addField(sigmaStorage[dir], "sigma_" +
>> std::to_string(dir), PoroMechVtkOutputModule::FieldType::element);
>> >         poroMechVtkWriter.addField(sigmaStorage[dir], "effSigma_" +
>> std::to_string(dir), PoroMechVtkOutputModule::FieldType::element);
>> >     }
>> >
>> >     using StressType = GetPropType<PoroMechTypeTag,
>> Properties::StressType>;
>> >     assembleElementStresses<StressType>(sigmaStorage, effSigmaStorage,
>> >             *poroMechProblem, *poroMechFvGridGeometry,
>> *poroMechGridVariables, x[poroMechId]);
>> >
>> > Any help is appreciated.
>> > Thank You!,
>> >
>> > Regards,
>> > Ranjeet
>> >
>> >
>> >
>> > _______________________________________________
>> > Dumux mailing list
>> > [email protected]
>> > https://listserv.uni-stuttgart.de/mailman/listinfo/dumux
>>
>>
_______________________________________________
Dumux mailing list
[email protected]
https://listserv.uni-stuttgart.de/mailman/listinfo/dumux

Reply via email to