Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
D
DOUAR WSMP
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
HUGG
DOUAR WSMP
Commits
e58ee284
Commit
e58ee284
authored
14 years ago
by
Dave Whipp
Browse files
Options
Downloads
Patches
Plain Diff
Modified refine surface to remove points along edges that are closer together than the levelmax+4
parent
c097aa1c
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/refine_surface.f90
+67
-37
67 additions, 37 deletions
src/refine_surface.f90
with
67 additions
and
37 deletions
src/refine_surface.f90
+
67
−
37
View file @
e58ee284
...
...
@@ -57,6 +57,7 @@ implicit none
type
(
parameters
)
params
type
(
sheet
)
surface
type
(
sheet
)
surface0
type
(
thread
)
threadinfo
integer
nadd
,
nrem
integer
is
,
istep
...
...
@@ -79,7 +80,7 @@ integer ie,j,jedge,kp,kpp,k,inode,inodep,inodepp,iadd,irem
integer
ntriangle
integer
nedge
integer
nedgen
,
nsurfacen
double precision
dist1
,
distmax
,
prod
,
distmin
double precision
dist1
,
distmax
,
prod
,
distmin
,
eps
double precision
,
external
::
dist
...
...
@@ -98,6 +99,7 @@ call mpi_comm_size (mpi_comm_world,nproc,ierr)
call
mpi_comm_rank
(
mpi_comm_world
,
iproc
,
ierr
)
shift
=
' '
eps
=
1.d-8
!------------------------
! build edge information
...
...
@@ -108,7 +110,6 @@ ntriangle=surface%nt
nedge
=
nsurfacen
+
ntriangle
-1
nnmax
=
12
! nnmax is maximum number of neighbours in triangulation (should be around 6 on average)
allocate
(
ed
(
nedge
),
stat
=
threadinfo
%
err
);
call
heap
(
threadinfo
,
'ed'
,
'refine_surface'
,
size
(
ed
),
'int'
,
+1
)
allocate
(
nedgepernode
(
nsurfacen
),
stat
=
threadinfo
%
err
)
call
heap
(
threadinfo
,
'nedgepernode'
,
'refine_surface'
,
size
(
nedgepernode
),
'int'
,
+1
)
...
...
@@ -119,40 +120,39 @@ call heap (threadinfo,'nodeedgenumber','refine_surface',size(nodeedgenumber),'in
ed
%
t1
=
0
ed
%
t2
=
0
nedgepernode
=
0
iedge
=
0
do
ie
=
1
,
ntriangle
do
k
=
1
,
3
inode
=
surface
%
icon
(
k
,
ie
)
kp
=
mod
(
k
,
3
)
+1
kpp
=
mod
(
k
+1
,
3
)
+1
inodep
=
surface
%
icon
(
kp
,
ie
)
inodepp
=
surface
%
icon
(
kpp
,
ie
)
do
j
=
1
,
nedgepernode
(
inodep
)
do
k
=
1
,
3
inode
=
surface
%
icon
(
k
,
ie
)
kp
=
mod
(
k
,
3
)
+1
kpp
=
mod
(
k
+1
,
3
)
+1
inodep
=
surface
%
icon
(
kp
,
ie
)
inodepp
=
surface
%
icon
(
kpp
,
ie
)
do
j
=
1
,
nedgepernode
(
inodep
)
if
(
nodenodenumber
(
j
,
inodep
)
.eq.
inode
)
then
jedge
=
nodeedgenumber
(
j
,
inodep
)
ed
(
jedge
)
%
m2
=
inodepp
ed
(
jedge
)
%
t2
=
ie
goto
111
jedge
=
nodeedgenumber
(
j
,
inodep
)
ed
(
jedge
)
%
m2
=
inodepp
ed
(
jedge
)
%
t2
=
ie
goto
111
endif
enddo
iedge
=
iedge
+1
if
(
iedge
.gt.
nedge
)
call
stop_run
(
'too many edges in delaunay2$'
)
nedgepernode
(
inode
)
=
nedgepernode
(
inode
)
+1
if
(
nedgepernode
(
inode
)
.gt.
nnmax
)
then
enddo
iedge
=
iedge
+1
if
(
iedge
.gt.
nedge
)
call
stop_run
(
'too many edges in delaunay2$'
)
nedgepernode
(
inode
)
=
nedgepernode
(
inode
)
+1
if
(
nedgepernode
(
inode
)
.gt.
nnmax
)
then
if
(
iproc
.eq.
0
)
write
(
8
,
*
)
'node'
,
inode
,
'has'
,
nedgepernode
(
inode
),
'neighbours'
call
stop_run
(
'too many neighbours$'
)
endif
nodenodenumber
(
nedgepernode
(
inode
),
inode
)
=
inodep
nodeedgenumber
(
nedgepernode
(
inode
),
inode
)
=
iedge
ed
(
iedge
)
%
n1
=
inode
ed
(
iedge
)
%
n2
=
inodep
ed
(
iedge
)
%
m1
=
inodepp
ed
(
iedge
)
%
t1
=
ie
111
continue
enddo
endif
nodenodenumber
(
nedgepernode
(
inode
),
inode
)
=
inodep
nodeedgenumber
(
nedgepernode
(
inode
),
inode
)
=
iedge
ed
(
iedge
)
%
n1
=
inode
ed
(
iedge
)
%
n2
=
inodep
ed
(
iedge
)
%
m1
=
inodepp
ed
(
iedge
)
%
t1
=
ie
111
continue
enddo
enddo
if
(
iedge
/
=
nedge
)
call
stop_run
(
'pb_b in refine_surface$'
)
...
...
@@ -163,7 +163,7 @@ if (iedge/=nedge) call stop_run ('pb_b in refine_surface$')
!distmax=1.d0/2.d0**surface%levelt*sqrt(2.d0)*surface%stretch
distmax
=
1.d0
/(
2.d0
**
surface
%
levelt
+1
)
*
sqrt
(
2.d0
)
*
surface
%
stretch
!opla
distmin
=
1.d0
/(
2.d0
**
surface
%
levelt
+4
)
*
sqrt
(
2.d0
)
distmin
=
1.d0
/(
2.d0
**
(
surface
%
levelt
+4
)
+1
)
*
sqrt
(
2.d0
)
allocate
(
refine
(
nedge
),
stat
=
err
)
allocate
(
refinep
(
nedge
),
stat
=
err
)
...
...
@@ -183,13 +183,13 @@ do iedge=1+iproc,nedge,nproc
prod
=
surface
%
xn
(
i1
)
*
surface
%
xn
(
i2
)
+
surface
%
yn
(
i1
)
*
surface
%
yn
(
i2
)
+
surface
%
zn
(
i1
)
*
surface
%
zn
(
i2
)
!if (dist1.gt.distmax .or. prod.lt.prodmin) refinep(iedge)=1
refinep
(
iedge
)
=
(
dist1
.gt.
distmax
)
removep
(
iedge
)
=
(
dist1
.le.
distmin
)
removep
(
iedge
)
=
(
dist1
.gt.
eps
.and.
dist1
.le.
distmin
)
!if (dist1.le.distmin) print *,'dist1 (',dist1,') less than distmin'
enddo
call
mpi_allreduce
(
refinep
,
refine
,
nedge
,
mpi_logical
,
mpi_lor
,
mpi_comm_world
,
ierr
)
call
mpi_allreduce
(
removep
,
remove
,
nedge
,
mpi_logical
,
mpi_lor
,
mpi_comm_world
,
ierr
)
!-----------------------
! compute nadd and naddp
!-----------------------
...
...
@@ -213,10 +213,20 @@ do iedge=1,nedge
if
(
remove
(
iedge
))
then
irem
=
irem
+1
if
(
ed
(
iedge
)
%
t1
.eq.
0
.or.
ed
(
iedge
)
%
t2
.eq.
0
)
nremp
=
nremp
+1
remove_list
(
irem
)
=
iedge
!remove_list(irem)=iedge
remove_list
(
irem
)
=
ed
(
iedge
)
%
n1
endif
enddo
! Modify remove_list to account for removal of nodes from surface
if
(
nrem
.gt.
0
)
then
do
i
=
1
,
nrem
do
j
=
i
,
nrem
if
(
remove_list
(
i
)
.lt.
remove_list
(
j
))
remove_list
(
j
)
=
remove_list
(
j
)
-1
enddo
enddo
endif
if
(
iadd
/
=
nadd
)
call
stop_run
(
'pb_b in refine_surface$'
)
if
(
irem
/
=
nrem
)
call
stop_run
(
'pb_b in refine_surface$'
)
...
...
@@ -308,6 +318,7 @@ deallocate (iconswap)
nnodeint
=
surface
%
nsurface
nelemint
=
surface
%
nt
nedgeint
=
nedge
do
i
=
1
,
nadd
iedge
=
refine_list
(
i
)
i1
=
ed
(
iedge
)
%
n1
...
...
@@ -332,10 +343,24 @@ enddo
if
(
iproc
.eq.
0
.and.
params
%
debug
>=
1
)
write
(
*
,
'(a,i2,a,i4,a)'
)
shift
//
'S.'
,
is
,
':'
,
nrem
,
' removed ptcls in refine_surface'
do
i
=
1
,
size
(
ed
%
n1
)
i1
=
ed
(
i
)
%
n1
i2
=
ed
(
i
)
%
n2
if
(
i1
.eq.
i2
)
then
print
*
,
'*******************************************************************'
print
*
,
'Nodes for edge '
,
i
,
' have the same spatial coordinates'
print
*
,
'The edges nodes are are node i1: '
,
i1
,
' and i2: '
,
i2
print
*
,
'x1:'
,
surface
%
x
(
i1
),
' y1: '
,
surface
%
y
(
i1
),
' z1: '
,
surface
%
z
(
i1
)
print
*
,
'x2:'
,
surface
%
x
(
i2
),
' y2: '
,
surface
%
y
(
i2
),
' z2: '
,
surface
%
z
(
i2
)
print
*
,
'*******************************************************************'
endif
enddo
surface
%
nsurface
=
nnodemax
surface
%
nt
=
nelemmax
do
i
=
1
,
nrem
iedge
=
remove_list
(
i
)
i1
=
ed
(
iedge
)
%
n1
i2
=
ed
(
iedge
)
%
n2
i1
=
remove_list
(
i
)
call
remove_point
(
i1
,
surface
,
0
,
surface0
)
end
do
...
...
@@ -347,6 +372,12 @@ end if
if
(
nnodeint
.ne.
nnodemax
)
call
stop_run
(
'Error counting nodes in refine_surface$'
)
if
(
nelemint
.ne.
nelemmax
)
call
stop_run
(
'Error counting elements in refine_surface$'
)
if
(
nrem
.gt.
0
)
then
nnodemax
=
surface
%
nsurface
nelemmax
=
surface
%
nt
nedgemax
=
nnodemax
+
nelemmax
-1
endif
surface
%
nsurface
=
nnodemax
surface
%
nt
=
nelemmax
nedge
=
nedgemax
...
...
@@ -359,7 +390,6 @@ call heap (threadinfo,'nedgepernode','refine_surface',size(nedgepernode),'int',-
call
heap
(
threadinfo
,
'nodenodenumber'
,
'refine_surface'
,
size
(
nodenodenumber
),
'int'
,
-1
)
;
deallocate
(
nodenodenumber
)
call
heap
(
threadinfo
,
'nodeedgenumber'
,
'refine_surface'
,
size
(
nodeedgenumber
),
'int'
,
-1
)
;
deallocate
(
nodeedgenumber
)
if
(
params
%
debug
.ge.
2
)
call
output_surf
(
surface
,
is
,
'after_refine'
,
istep
,
ref_count
)
end
subroutine
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment