Report Typos and Errors    
Semi-Lagrangian Library
Modular library for kinetic and gyrokinetic simulations of plasmas in fusion energy devices.
sol.f
Go to the documentation of this file.
1  subroutine sol (vkgs,vkgd,vkgi,vfg,kld,vu,neq,mp,ifac,isol,
2  $ nsym,energ,ier,nsky)
3 
4 c resolution d'un systeme lineaire symetrique ou non. la matrice est
5 c stockee par ligne de ciel,en memoire dans les tables vkgs,vkgd,vkgi
6 c
7 c entrees
8 c vkgs,vkgd,vkgi matrice du systeme : parties superieure,
9 c diagonale, inferieure (double precision)
10 c vfg second membre
11 c kld pointeurs vers les hauts de colonne
12 c vu vecteur solution (qui peut etre vfg)
13 c neq nombre d'equations
14 c mp unite logique d'impression
15 c ifac si ifac.eq.1 triangularisation de
16 c la matrice
17 c isol si isol.eq.1 calcul de la solution a
18 c partir de la matrice triangularisee
19 c nsym indice de probleme non symetrique
20 c sorties
21 c vkgs,vkgd,vkgi matrice triangularisee (si ifac.eq.1)
22 c vu solution (si isol.eq.1)
23 c energ energie du systeme (si nsym.eq.0)
24 c ier mis a 1 si pivot nul rencontre
25 c
26 c=========================== debut des declarations ====================
27  implicit real(8) (a-h,o,q-z)
28  implicit integer (p)
29  dimension vkgs(nsky),vkgd(neq),vkgi(nsky),vfg(neq),kld(neq+1)
30  & ,vu(neq)
31  data vzero/0.d0/
32 c=========================== debut du code executable ==================
33 c
34 c------- traitement
35 c
36  print*, size(vkgd)
37  ik=1
38  if(vkgd(1).eq.vzero) goto 800
39  energ=vzero
40  ier=0
41  if (isol.eq.1) then
42  do i = 1, neq
43  vu(i) = vfg(i)
44  end do
45  end if
46 c
47 c------- pour chaque colonne ik a modifier
48 c
49  jhk=1
50  do ik=2,neq
51 c
52 c------- pointeur du haut de la colonne suivante ik+1
53 c
54  jhk1=kld(ik+1)
55 c
56 c------- hauteur de la colonne ik (hors termes superieur et diagonal)
57 c
58  lhk=jhk1-jhk
59  lhk1=lhk-1
60 c
61 c------- ligne du premier terme a modifier dans la colonne ik
62 c
63  imin=ik-lhk1
64  imin1=imin-1
65 c
66 c------- ligne du dernier terme a modifier dans la colonne ik
67 c
68  imax=ik-1
69  if(lhk1.lt.0) goto 100
70  if(ifac.ne.1) goto 90
71  if(nsym.eq.1) vkgi(jhk)=vkgi(jhk)/vkgd(imin1)
72  if(lhk1.eq.0) goto 40
73 c
74 c------- modifier les termes non diagonaux de la colonne ik
75 c
76  jck=jhk+1
77  jhj=kld(imin)
78 c
79 c------- pour chaque terme place en jck, correspondant a la colonne ij
80 c
81  do ij=imin,imax
82  jhj1=kld(ij+1)
83 c
84 c------- nombre de termes modificatifs du terme place en jck
85 c
86  ic=min0(jck-jhk,jhj1-jhj)
87  if(ic.le.0.and.nsym.eq.0) goto 20
88  c1=vzero
89  if(ic.le.0) goto 17
90  j1=jhj1-ic
91  j2=jck-ic
92  if(nsym.eq.1) goto 15
93  vkgs(jck)=vkgs(jck)-scal(vkgs(j1),vkgs(j2),ic)
94  goto 20
95 15 vkgs(jck)=vkgs(jck)-scal(vkgi(j1),vkgs(j2),ic)
96  c1=scal(vkgs(j1),vkgi(j2),ic)
97 17 vkgi(jck)=(vkgi(jck)-c1)/vkgd(ij)
98 20 jck=jck+1
99  jhj=jhj1
100  end do
101 c
102 c------- modifier le terme diagonal
103 c
104 40 jck=jhk
105  cdiag=vzero
106  do ij=imin1,imax
107  c1=vkgs(jck)
108  if(nsym.eq.1) goto 50
109  c2=c1/vkgd(ij)
110  vkgs(jck)=c2
111  goto 60
112 50 c2=vkgi(jck)
113 60 cdiag=cdiag+c1*c2
114  jck=jck+1
115  end do
116  vkgd(ik)=vkgd(ik)-cdiag
117  if (vkgd(ik).eq.0.0d0) goto 800
118 c
119 c------- resolution du systeme triangulaire inferieur
120 c
121 90 if(isol.ne.1) goto 100
122  if(nsym.ne.1) vu(ik)=vfg(ik)-scal(vkgs(jhk),vu(imin1),lhk)
123  if(nsym.eq.1) vu(ik)=vfg(ik)-scal(vkgi(jhk),vu(imin1),lhk)
124 100 jhk=jhk1
125  end do
126  if(isol.ne.1) goto 9999
127 c
128 c------- resolution du systeme diagonal :
129 c
130  if(nsym.eq.1) goto 120
131  do ik=1,neq
132  c1=vkgd(ik)
133  if (c1.eq.vzero) goto 800
134  c2=vu(ik)/c1
135  vu(ik)=c2
136  energ=energ+c1*c2*c2
137  end do
138 c
139 c------- resolution du systeme triangulaire superieur
140 c
141 120 ik=neq+1
142  jhk1=kld(ik)
143 130 ik=ik-1
144  if(nsym.eq.1) vu(ik)=vu(ik)/vkgd(ik)
145  if(ik.eq.1) goto 9999
146  c1=vu(ik)
147  jhk=kld(ik)
148  jbk=jhk1-1
149  if(jhk.gt.jbk)goto 150
150  ij=ik-jbk+jhk-1
151  do jck=jhk,jbk
152  vu(ij)=vu(ij)-vkgs(jck)*c1
153  ij=ij+1
154  end do
155 150 jhk1=jhk
156  goto 130
157 c
158 c------- erreurs
159 c
160 800 if (mp.ne.0) write(mp,8000) ik
161 8000 format(' * sol pivot nul equation',i5)
162  ier=1
163  goto 9999
164 c
165 c------- fin
166 c
167 9999 continue
168  return
169 c=========================== fin du module sol ==================
170  end
171 
172  function scal(x,y,n)
173 c=======================================================================
174 c calcul du produit scalaire
175 c=======================================================================
176  implicit real(8) (a-h,o-z)
177  dimension x(n),y(n)
178  data zero/0.d0/
179 c234567------------------------------------------------------------------
180  scal=zero
181  do i=1,n
182 ! write(*,*) 'scal',n,i,x(i)*y(i)
183 !!!!! horrible !!!!!
184 c$$$ if (abs(x(i)).gt.1.d-20.and.abs(y(i)).gt.1.d-20)
185 c$$$ & scal=scal+x(i)*y(i)
186  scal=scal+x(i)*y(i)
187  enddo
188 ! write(*,*) 'finscal'
189  return
190  end
subroutine sol(vkgs, vkgd, vkgi, vfg, kld, vu, neq, mp, ifac, isol, nsym, energ, ier, nsky)
Definition: sol.f:3
function scal(x, y, n)
Definition: sol.f:173
    Report Typos and Errors