Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Aland, Sebastian
amdis
Commits
d079a85e
Commit
d079a85e
authored
Jan 15, 2014
by
Praetorius, Simon
Browse files
demo for polarization ordering
parent
6e272d9d
Changes
1
Hide whitespace changes
Inline
Side-by-side
extensions/demo/other/src/polarizationField.cc
0 → 100644
View file @
d079a85e
/******************************************************************************
*
* Extension of AMDiS - Adaptive multidimensional simulations
*
* Copyright (C) 2013 Dresden University of Technology. All Rights Reserved.
* Web: https://fusionforge.zih.tu-dresden.de/projects/amdis
*
* Authors: Simon Praetorius et al.
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
*
* See also license.opensource.txt in the distribution.
*
******************************************************************************/
#include "AMDiS.h"
#include "PolarizationField_RB.h"
#include "time/ExtendedRosenbrockAdaptInstationary.h"
using
namespace
AMDiS
;
class
MyPolarizationField
:
public
PolarizationField_RB
{
public:
MyPolarizationField
(
std
::
string
name
)
:
PolarizationField_RB
(
name
)
{}
/// Set initial condition and perform initial refinement
void
solveInitialProblem
(
AdaptInfo
*
adaptInfo
)
{
struct
RandomNormalizedVector
:
public
AbstractFunction
<
WorldVector
<
double
>
,
WorldVector
<
double
>
>
{
RandomNormalizedVector
()
:
AbstractFunction
<
WorldVector
<
double
>
,
WorldVector
<
double
>
>
(
1
)
{
std
::
srand
(
time
(
0
));
}
WorldVector
<
double
>
operator
()(
const
WorldVector
<
double
>&
x
)
const
{
WorldVector
<
double
>
p
;
for
(
int
i
=
0
;
i
<
p
.
getSize
();
i
++
)
p
[
i
]
=
cos
(
4.0
*
m_pi
*
((
std
::
rand
()
/
static_cast
<
double
>
(
RAND_MAX
))
-
0.5
));
double
nrm
=
norm
(
p
);
for
(
int
i
=
0
;
i
<
p
.
getSize
();
i
++
)
p
[
i
]
*=
1.0
/
nrm
;
return
p
;
}
};
self
::
getVectorField
()
->
interpol
(
new
RandomNormalizedVector
);
for
(
int
i
=
0
;
i
<
Global
::
getGeo
(
WORLD
);
i
++
)
transformDOF
(
self
::
getVectorField
(),
self
::
getSolution
()
->
getDOFVector
(
i
),
new
AMDiS
::
Component2
<>
(
i
));
}
void
fillBoundaryConditions
()
override
{
std
::
vector
<
DOFVector
<
double
>*>
values
(
3
);
values
[
0
]
=
new
DOFVector
<
double
>
(
self
::
getFeSpace
(
0
),
"v0"
);
values
[
0
]
->
set
(
0.0
);
values
[
1
]
=
new
DOFVector
<
double
>
(
self
::
getFeSpace
(
0
),
"v1"
);
values
[
1
]
->
set
(
1.0
);
values
[
2
]
=
new
DOFVector
<
double
>
(
self
::
getFeSpace
(
0
),
"v2"
);
values
[
2
]
->
set
(
-
1.0
);
int
idx
=
1
;
for
(
int
i
=
0
;
i
<
Global
::
getGeo
(
WORLD
);
i
++
)
{
for
(
int
j
=
0
;
j
<
Global
::
getGeo
(
WORLD
);
j
++
)
{
double
value1
=
double
(
i
==
j
);
double
value2
=
-
double
(
i
==
j
);
self
::
prob
->
addDirichletBC
(
idx
,
1
-
j
+
self
::
dow
,
1
-
j
,
new
AMDiS
::
Const
<
double
,
WorldVector
<
double
>
>
(
value1
));
self
::
prob
->
addDirichletBC
(
idx
+
1
,
1
-
j
+
self
::
dow
,
1
-
j
,
new
AMDiS
::
Const
<
double
,
WorldVector
<
double
>
>
(
value1
));
}
idx
+=
2
;
}
}
};
int
main
(
int
argc
,
char
**
argv
)
{
FUNCNAME
(
"main"
);
AMDiS
::
init
(
argc
,
argv
);
Timer
t
;
MyPolarizationField
pProb
(
"p"
);
pProb
.
initialize
(
INIT_ALL
);
pProb
.
initTimeInterface
();
// Adapt-Infos
AdaptInfo
adaptInfo
(
"adapt"
,
pProb
.
getNumComponents
());
ExtendedRosenbrockAdaptInstationary
<
MyPolarizationField
>
adaptInstat
(
"adapt"
,
pProb
,
adaptInfo
,
pProb
,
adaptInfo
);
int
error_code
=
adaptInstat
.
adapt
();
MSG
(
"elapsed time= %d sec
\n
"
,
t
.
elapsed
());
AMDiS
::
finalize
();
return
error_code
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment