Hi Felix,

just a remark to that solution. This is usually not what you wanna do from a 
programming point of view. The problem is now that your gravityAtPos has an 
unexpected side effect. Accessing the gravity variable before and after a call 
to gravityAtPos yields different results althought the name (and signature, 
const) doesnt suggest it modifies anything. There a two better ways depending 
on what you need. 

1) if the gravity distribution is constant over the simulation time: Modify the 
gravity_ variable simply in the constructor (once) and than return gravity_ in 
your function. This is also more efficient since gravityAtPos is called on 
every flux calculation, i.e. probably million of times. 

If it changes in every cell you can also initialize a vector with the cell data 
in the constructor and then return those entries. 

2) If the gravity is the result of a simple computation depending on the 
globalPos argument you might choose to do it inside the function. Then you need 
to change the signature to

GlobalPostion gravityAtPos(const GlobalPostition& globalPos) const
{
     GlobalPosition gravity(0.0); // initialize to zero
      gravity[2] = globalPos[2]*10; // some function
      return gravity;
}

i.e. return by value instead of return by reference, and create a temporary 
gravity vector inside the function. 
Avoid mutable in general. It has only some very special used cases, i.e. 
internal caching. 

Best wishes 
Timo

> Am 13.01.2019 um 08:57 schrieb Felix Feldmann <felix.feldm...@ku.ac.ae>:
> 
> Dear All,
>  
> Thanks everyone for your help.
>  
> Gion suggested a solution (I think his email did not go through on the 
> server), which works fine in my problem.file.
>  
> const GravityVector &gravityAtPos(const GlobalPosition &pos) const
>           {
>                         if (pos[0] <  20)
>                                   
>                             { gravity_[0] = -100;  }
>                         else
>                             {  gravity_[0] = 100;    }
>                           
>         return gravity_;
>           }
> with
>  
> mutable DimVector gravity_;
>  
> Best regards,
> Felix
>  
> From: Dumux [mailto:dumux-boun...@listserv.uni-stuttgart.de] On Behalf Of 
> georg.fut...@dlr.de
> Sent: Tuesday, January 08, 2019 5:22 PM
> To: dumux@listserv.uni-stuttgart.de
> Subject: Re: [DuMuX] gravity dependency on global postion
>  
> Hi Timo,
>  
> Thanks for the correction J
>  
> Georg
>  
> Von: Dumux [mailto:dumux-boun...@listserv.uni-stuttgart.de] Im Auftrag von 
> Timo Koch
> Gesendet: Dienstag, 8. Januar 2019 09:22
> An: DuMuX User Forum; Felix Feldmann
> Betreff: Re: [DuMuX] gravity dependency on global postion
>  
> Hi Felix, hi Georg,
> 
>  
> 
> Georg's suggestion results in undefined behaviour because it's returning a 
> reference to a temporary vector. You should also get a compiler warning for 
> that.
> 
>  
> 
> @Felix on first sight there seems to be nothing wrong with your 
> implementation, except that you should initialize your gravity_ variable 
> (best practice).
> 
> Did you verify that your functions (the bit in preTimeStep and the 
> gravityAtPos function)
> 
> is actually called? Maybe just put a console output in there or a break point 
> for the debugger.
> 
>  
> 
> Timo
> 
>  
> 
> On 08.01.19 09:03, georg.fut...@dlr.de wrote:
> Hi Felix,
>  
> You could try to run you problem with valgrind. Just type ‘valgrind 
> ./my_problem’ to do that. Then you might see where the error comes from. If 
> the output does not give you an idea try to compile your problem with 
> debug-opts and rerun it with valgrind.
>  
> Best regards
> Georg
>  
> Von: Dumux [mailto:dumux-boun...@listserv.uni-stuttgart.de] Im Auftrag von 
> Felix Feldmann
> Gesendet: Dienstag, 8. Januar 2019 08:54
> An: DuMuX User Forum
> Betreff: Re: [DuMuX] gravity dependency on global postion
>  
> Dear Georg,
>  
> Thank you very much for the suggestion.
>  
> Unfortunately, I do get a segmentation fault (core dumped).
> The error occurs independently from the used gravity values (I tried gravity 
> values of 0, -9.81 or 100).
>  
> Best regards,
> Felix
>  
>  
>  
> From: Dumux [mailto:dumux-boun...@listserv.uni-stuttgart.de] On Behalf Of 
> georg.fut...@dlr.de
> Sent: Monday, January 07, 2019 6:42 PM
> To: dumux@listserv.uni-stuttgart.de
> Subject: Re: [DuMuX] gravity dependency on global postion
>  
> Hi Felix,
>  
> You should try the following:
>  
> const GravityVector &gravityAtPos(const GlobalPosition &pos) const
> {
> // initialize a gravity vector with zeros
> GravityVector gravity(0.0);
>  
> // modify the entry for the x (???) direction according to your needs
> if (onLeftArea_( pos))
> gravity[0]=100;
> else // don’t use else if here so gravity[0] is always defined!
> gravity[0]=-100;
>  
> return gravity;
> }
>  
> Best regards
> Georg
>  
> Von: Dumux [mailto:dumux-boun...@listserv.uni-stuttgart.de] Im Auftrag von 
> Felix Feldmann
> Gesendet: Montag, 7. Januar 2019 15:03
> An: DuMuX User Forum
> Betreff: Re: [DuMuX] gravity dependency on global postion
>  
> Hello Kilian & Timo,
>  
> Thanks for your quick reply.
>  
> 1)      I initially added following line to my problem:
>  
> typedef Dune::FieldVector<Scalar, dimWorld> GravityVector;
>  
>  
> 2)      The gravity values are then defined inside the preTimeStep() function:
>  
> void preTimeStep()
> {
> if (GET_PARAM_FROM_GROUP(TypeTag, bool, Problem, EnableGravity))
>                 {
>                                                                 if 
> (onLeftArea_(globalPos))
>                
>                                                            { gravity_=100; }
>                                                                               
>                                  
>                                                      else if 
> (onRightArea_(globalPos))
>                                                                 {  
> gravity_=-100;  }
>           }
> }                                                             
>  
> 3)      The gravity vector function is then added as suggested by Martin:
>  
>  
> const GravityVector &gravityAtPos(const GlobalPosition &pos) const
>  
>                 {  return gravity_;}
>  
> 4)      Finally gravity_ is defined as a GravityVector:
>  
>   GravityVector gravity_;
>  
>  
>  
> Best regards,
> Felix
>  
>  
>  
>  
>  
> From: Dumux [mailto:dumux-boun...@listserv.uni-stuttgart.de] On Behalf Of 
> Kilian Weishaupt
> Sent: Monday, January 07, 2019 5:15 PM
> To: dumux@listserv.uni-stuttgart.de
> Subject: Re: [DuMuX] gravity dependency on global postion
>  
> Hi Felix,
> 
> are you sure you correctly overloaded the gravityAtPos method in your 
> problem? Maybe there is a typo and your code actually still uses the base 
> class's method which returns a constant value.
> 
> Kilian
> 
> On 01/07/2019 11:58 AM, Timo Koch wrote:
> Hi Felix,
>  
> how did you verify this? We would need some more information to see what the 
> issue is. You get a position inside the gravity member function so if you use 
> that to determine your gravity vector it should also use these different 
> gravity vectors...
>  
> Timo
> 
> Am 07.01.2019 um 10:12 schrieb Felix Feldmann <felix.feldm...@ku.ac.ae>:
> 
> Dear Martin,
>  
> Thank you very much for your answer.
>  
> As suggested, I implemented the GravityVector method inside my problem file.
>  
> Although I defined different gravity values for each global position, the 
> resulting gravity still appears to be just one constant value.
>  
> I am using DuMux 2.12.0
>  
> Kind regards,
> Felix
>  
>  
> From: Martin Schneider [mailto:martin.schnei...@iws.uni-stuttgart.de] 
> Sent: Wednesday, December 19, 2018 6:49 PM
> To: DuMuX User Forum <dumux@listserv.uni-stuttgart.de>; Felix Feldmann 
> <felix.feldm...@ku.ac.ae>
> Subject: Re: [DuMuX] gravity dependency on global postion
>  
> Dear Felix,
> 
> you have to implement the following function
>     const GravityVector &gravityAtPos(const GlobalPosition &pos) const
> in your own problem file. 
> This overwrites the function from/dumux/porousmediumflow/problem.hh
> 
> I hope this helps.
> 
> Regards,
> Martin
> 
> On 12/19/2018 03:43 PM, Felix Feldmann wrote:
> Dear DuMux community,
>  
> Is there any method to define gravity dependency on the global position? Or 
> in other words, is it possible to define a specific gravity value for each 
> node?
>  
> Best regards,
> Felix
>  
>  
> 
> _______________________________________________
> Dumux mailing list
> Dumux@listserv.uni-stuttgart.de
> https://listserv.uni-stuttgart.de/mailman/listinfo/dumux
>  
> 
> -- 
> M.Sc. Martin Schneider
> University of Stuttgart         
> Institute for Modelling Hydraulic and Environmental Systems
> Department of Hydromechanics and Modelling of Hydrosystems
> Pfaffenwaldring 61
> D-70569 Stuttgart
> Tel: (+49) 0711/ 685-69159
> Fax: (+49) 0711/ 685-60430
> E-Mail: martin.schnei...@iws.uni-stuttgart.de
> _______________________________________________
> Dumux mailing list
> Dumux@listserv.uni-stuttgart.de
> https://listserv.uni-stuttgart.de/mailman/listinfo/dumux
>  
> 
> _______________________________________________
> Dumux mailing list
> Dumux@listserv.uni-stuttgart.de
> https://listserv.uni-stuttgart.de/mailman/listinfo/dumux
>  
> 
> -- 
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> Kilian Weishaupt M.Sc.
> Institut für Wasser- und Umweltsystemmodellierung (IWS)
> Lehrstuhl für Hydromechanik und Hydrosystemmodellierung
> Universität Stuttgart, Pfaffenwaldring 61, 70569 Stuttgart
> Email: kilian.weisha...@iws.uni-stuttgart.de
> Telefon: 0049 711 685-60461 ** fax: 0049-711-685-60430
> http://www.hydrosys.uni-stuttgart.de
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
>  
> 
> _______________________________________________
> Dumux mailing list
> Dumux@listserv.uni-stuttgart.de
> https://listserv.uni-stuttgart.de/mailman/listinfo/dumux
> -- 
> _______________________________________________________________
>  
> Timo Koch                              phone: +49 711 685 64676
> IWS, Universität Stuttgart             fax:   +49 711 685 60430
> Pfaffenwaldring 61        email: timo.k...@iws.uni-stuttgart.de
> D-70569 Stuttgart            url: www.hydrosys.uni-stuttgart.de
> _______________________________________________________________
> _______________________________________________
> Dumux mailing list
> Dumux@listserv.uni-stuttgart.de
> https://listserv.uni-stuttgart.de/mailman/listinfo/dumux
_______________________________________________
Dumux mailing list
Dumux@listserv.uni-stuttgart.de
https://listserv.uni-stuttgart.de/mailman/listinfo/dumux

Reply via email to