1 |
# $Id$ |
2 |
|
3 |
|
4 |
from esys.modelframe import Model |
5 |
from esys.escript import * |
6 |
from math import log |
7 |
|
8 |
|
9 |
class GausseanProfile(Model): |
10 |
"""@brief generates a gaussean profile at center x_c, width width and height A over a domain |
11 |
|
12 |
@param domain (in) - domain |
13 |
@param x_c (in) - center of the Gaussean profile (default [0.,0.,0.]) |
14 |
@param A (in) - height of the profile. A maybe a vector. (default 1.) |
15 |
@param width (in) - width of the profile (default 0.1) |
16 |
@param r (in) - radius of the circle (default = 0) |
17 |
@param out (out) - profile |
18 |
|
19 |
|
20 |
In the case that the spatial dimension is two, The third component of x_c is dropped |
21 |
""" |
22 |
def __init__(self,debug=False): |
23 |
Model.__init__(self,debug=debug) |
24 |
self.declareParameter(domain=None, x_c=numarray.zeros([3]),A=1.,width=0.1,r=0) |
25 |
|
26 |
def out(self): |
27 |
x=self.domain.getX() |
28 |
dim=self.domain.getDim() |
29 |
l=length(x-self.x_c[:dim]) |
30 |
m=(l-self.r).whereNegative() |
31 |
return (m+(1.-m)*exp(-log(2.)*(l/self.width)**2))*self.A |
32 |
|
33 |
class InterpolatedTimeProfile(Model): |
34 |
""" """ |
35 |
|
36 |
def __init__(self,debug=False): |
37 |
Model.__init__(self,debug=debug) |
38 |
self.declareParameter(t=[0.,1.],\ |
39 |
values=[1.,1.],\ |
40 |
out=0.) |
41 |
def doInitialization(self,t): |
42 |
self.__tn=t |
43 |
|
44 |
def doStep(self,dt): |
45 |
t=self.__tn+dt |
46 |
if t<=self.t[0]: |
47 |
self.out=self.values[0] |
48 |
else: |
49 |
for i in range(1,len(self.t)): |
50 |
if t<self.t[i]: |
51 |
m=(self.values[i-1]-self.values[i])/(self.t[i-1]-self.t[i]) |
52 |
self.out=m*(t-self.t[i-1])+self.values[i-1] |
53 |
self.out=self.t[len(self.t)-1] |
54 |
self.__tn+=dt |