Merge lp:~fluidity-core/fluidity/fix_coord_transformations into lp:fluidity
- fix_coord_transformations
- Merge into dev-trunk
Status: | Merged |
---|---|
Approved by: | Simon Mouradian |
Approved revision: | 4078 |
Merged at revision: | 4095 |
Proposed branch: | lp:~fluidity-core/fluidity/fix_coord_transformations |
Merge into: | lp:fluidity |
Diff against target: | 28922 lines |
To merge this branch: | bzr merge lp:~fluidity-core/fluidity/fix_coord_transformations |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Simon Mouradian | Needs Fixing | ||
Stephan Kramer | Needs Fixing | ||
Jon Hill | Pending | ||
Review via email:
|
Commit message
Description of the change
Corrections to coordinate transformation routines and addition of new routines for vector and tensor change of basis.
- 4051. By Alexandros Avdis
-
Merge from buoyancy adjustment branch, affecting fix of buoyancy adjustment on the sphere, and removing some commented-out code.
- 4052. By Alexandros Avdis
-
Removed some redundant, commented-out code.
- 4053. By Alexandros Avdis
-
Merge-commit from from fluidity trunk, in order to keep present branch up to date.
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Alexandros Avdis (alexandros-avdis) wrote : | # |
Thanks! I think the problematic code was a result of an un-intended merge from another branch. I fixed the commented-out code and it should now also treat a problem we have been having with buouancy adjustmen on the sphere.
- 4054. By Alexandros Avdis
-
Committing some aesthetical improvements to in-code comments. Also removed some code writing information to output, as it was bloating the log-files in large-scale tests.
- 4055. By Alexandros Avdis
-
Added vector_
lon_lat_ height_ 2_cartesian_ c to header file. - 4056. By Alexandros Avdis
-
Tiding-up some modifications, also the momentum flux components (surface stress) are now correctly transformed back into Cartesian.
- 4057. By Alexandros Avdis
-
Commit following merging in trunk, in order to keep present branch up to date.
- 4058. By Alexandros Avdis
-
Commit following merge from trunk, to keep present branch up to date.
- 4059. By Alexandros Avdis
-
Removed code addressing Buoyancy adjustment on the sphere corrections, as it belongs to another branch; it was entered here after incorrect merge.
- 4060. By Alexandros Avdis
-
Corrections to ERA40-forcing routines: lon-lat to Cartesian coordinate conversion is needed even when the -problem is not "on the sphere". Added C-inter-operable version of routine converting lon-lat into Cartesian coordinates and made some grammatical corrections to in-code comments in femtools/
Coordinates. F90 - 4061. By Alexandros Avdis
-
Added C-inter-operable routine for converting Cartesian coordinates into lon-lat-height. Also added function prototypes in include/
coordinates. h . - 4062. By Alexandros Avdis
-
Some "aesthetic" modifications to ocean_forcing/
forcingERA40. cpp, and changed some lines of ocean_forcing/ tests/test_ coare_ocean_ fluxes. cpp to use the new transformations routines. - 4063. By Jon Hill
-
Fixing forcing unit tests. The coordinate transform had a bug in it when used via c - the output variables weren't set. THis is now fixed and the UTs moved over to the new projection functions
- 4064. By Simon Mouradian
-
Minor typo corrections.
- 4065. By Alexandros Avdis
-
Merge-in of trunk, to keep present branch up to date.
- 4066. By Simon Mouradian
-
Change FORTRAN to Fortran
- 4067. By Simon Mouradian
-
Comment correction
- 4068. By Simon Mouradian
-
Fix typo
- 4069. By Simon Mouradian
-
Further comment correction
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Simon Mouradian (mouradian) wrote : | # |
In femtools/
subroutine spherical_
-) Distance from referenceRadius (if referenceRadius is present)
-) Distance from center (i.e. equal to the radius) if referenceRadius is absent.
This behavious is inconsistent with the inverse routine lon_lat_
- 4070. By Simon Mouradian
-
Small bug fix in cartesian_
2_lon_lat_ height_ c and more comment corrections
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Simon Mouradian (mouradian) wrote : | # |
In femtools/
subroutine transformation_
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Simon Mouradian (mouradian) wrote : | # |
In femtools/
The intent for each subroutine argument should be specified.
Perhaps it would also be a good idea to have an assertion here that the two fields are on the same function space, before looping over all the nodes?
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Simon Mouradian (mouradian) wrote : | # |
In femtools/
Ther subroutine vector_
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Simon Mouradian (mouradian) wrote : | # |
In femtools/
The function rotate_
mesh_dim(
- 4071. By Simon Mouradian
-
Minor cleanup
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Simon Mouradian (mouradian) wrote : | # |
I'm uncertain as to why the tests need to write results to vtu. I think this is just producing data that is never used.
- 4072. By Simon Mouradian
-
fix typo
- 4073. By Alexandros Avdis
-
Merging back, tiding-up.
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Simon Mouradian (mouradian) wrote : | # |
Possibly no test for vector_
- 4074. By Simon Mouradian
-
Changes to address review. Thanks to Avdis for help.
- 4075. By Alexandros Avdis
-
Merging in additions to manual.
- 4076. By Alexandros Avdis
-
Modified the python version of the vector change of basis to use numpy rather than scipy.
- 4077. By Alexandros Avdis
-
Moved the python module containing the tensor basis change and coordinate transformation routines to a more central directory as it will be used by simulations (python diagnostics in flmls).
- 4078. By Simon Mouradian
-
merge trunk
Preview Diff
1 | === modified file 'femtools/Coordinates.F90' | |||
2 | --- femtools/Coordinates.F90 2012-05-15 18:17:00 +0000 | |||
3 | +++ femtools/Coordinates.F90 2012-10-19 14:09:23 +0000 | |||
4 | @@ -37,6 +37,8 @@ | |||
5 | 37 | use halos_base | 37 | use halos_base |
6 | 38 | use sparse_tools_petsc | 38 | use sparse_tools_petsc |
7 | 39 | use state_module | 39 | use state_module |
8 | 40 | use global_parameters, only: surface_radius | ||
9 | 41 | use iso_c_binding | ||
10 | 40 | 42 | ||
11 | 41 | implicit none | 43 | implicit none |
12 | 42 | 44 | ||
13 | @@ -48,9 +50,19 @@ | |||
14 | 48 | 50 | ||
15 | 49 | public:: & | 51 | public:: & |
16 | 50 | LongitudeLatitude, & | 52 | LongitudeLatitude, & |
18 | 51 | ll2r3_rotate, rotate2ll, & | 53 | spherical_polar_2_cartesian, cartesian_2_spherical_polar, & |
19 | 54 | spherical_polar_2_cartesian_c, cartesian_2_spherical_polar_c, & | ||
20 | 55 | ll2r3_rotate, & | ||
21 | 56 | lon_lat_height_2_spherical_polar, spherical_polar_2_lon_lat_height, & | ||
22 | 57 | lon_lat_height_2_cartesian, cartesian_2_lon_lat_height, & | ||
23 | 58 | lon_lat_height_2_cartesian_c, cartesian_2_lon_lat_height_c, & | ||
24 | 59 | vector_spherical_polar_2_cartesian, vector_cartesian_2_spherical_polar, & | ||
25 | 60 | vector_lon_lat_height_2_cartesian, vector_cartesian_2_lon_lat_height, & | ||
26 | 61 | vector_lon_lat_height_2_cartesian_c, vector_cartesian_2_lon_lat_height_c, & | ||
27 | 62 | tensor_spherical_polar_2_cartesian, & | ||
28 | 52 | higher_order_sphere_projection, & | 63 | higher_order_sphere_projection, & |
29 | 53 | sphere_inward_normal_at_quad_ele, sphere_inward_normal_at_quad_face, & | 64 | sphere_inward_normal_at_quad_ele, sphere_inward_normal_at_quad_face, & |
30 | 65 | rotate_diagonal_to_cartesian_gi, rotate_diagonal_to_cartesian_face, & | ||
31 | 54 | rotate_diagonal_to_sphere_gi, rotate_diagonal_to_sphere_face, & | 66 | rotate_diagonal_to_sphere_gi, rotate_diagonal_to_sphere_face, & |
32 | 55 | rotate_ct_m_sphere, rotate_momentum_to_sphere, & | 67 | rotate_ct_m_sphere, rotate_momentum_to_sphere, & |
33 | 56 | rotate_velocity_sphere, rotate_velocity_back_sphere, & | 68 | rotate_velocity_sphere, rotate_velocity_back_sphere, & |
34 | @@ -60,6 +72,26 @@ | |||
35 | 60 | module procedure LongitudeLatitude_single, LongitudeLatitude_multiple | 72 | module procedure LongitudeLatitude_single, LongitudeLatitude_multiple |
36 | 61 | end interface | 73 | end interface |
37 | 62 | 74 | ||
38 | 75 | interface spherical_polar_2_cartesian | ||
39 | 76 | module procedure spherical_polar_2_cartesian, & | ||
40 | 77 | spherical_polar_2_cartesian_field | ||
41 | 78 | end interface | ||
42 | 79 | |||
43 | 80 | interface cartesian_2_spherical_polar | ||
44 | 81 | module procedure cartesian_2_spherical_polar, & | ||
45 | 82 | cartesian_2_spherical_polar_field | ||
46 | 83 | end interface | ||
47 | 84 | |||
48 | 85 | interface vector_spherical_polar_2_cartesian | ||
49 | 86 | module procedure vector_spherical_polar_2_cartesian, & | ||
50 | 87 | vector_spherical_polar_2_cartesian_field | ||
51 | 88 | end interface | ||
52 | 89 | |||
53 | 90 | interface vector_cartesian_2_spherical_polar | ||
54 | 91 | module procedure vector_cartesian_2_spherical_polar, & | ||
55 | 92 | vector_cartesian_2_spherical_polar_field | ||
56 | 93 | end interface | ||
57 | 94 | |||
58 | 63 | contains | 95 | contains |
59 | 64 | 96 | ||
60 | 65 | subroutine LongitudeLatitude_single(xyz, longitude, latitude) | 97 | subroutine LongitudeLatitude_single(xyz, longitude, latitude) |
61 | @@ -107,19 +139,856 @@ | |||
62 | 107 | 139 | ||
63 | 108 | end subroutine ll2r3_rotate | 140 | end subroutine ll2r3_rotate |
64 | 109 | 141 | ||
78 | 110 | ! rotates vector in cartesian to align with lat/long | 142 | subroutine spherical_polar_2_cartesian(radius,theta,phi,x,y,z) |
79 | 111 | elemental subroutine rotate2ll(longitude, latitude, r3u, r3v, r3w, u, v) | 143 | !Subroutine for calculation of Cartesian coordinates from spherical-polar |
80 | 112 | real, intent(in) :: longitude, latitude, r3u, r3v, r3w | 144 | ! coordinates. |
81 | 113 | real, intent(out) :: u, v | 145 | implicit none |
82 | 114 | real lat | 146 | |
83 | 115 | real long | 147 | real, intent(in) :: radius !Distance from centre of sphere |
84 | 116 | lat = deg_to_rad*latitude | 148 | real, intent(in) :: theta !Polar angle, in radians |
85 | 117 | long = deg_to_rad*longitude | 149 | real, intent(in) :: phi !Azimuthal angle, in radians |
86 | 118 | 150 | real, intent(out) :: x,y,z !Cartesian coordinates | |
87 | 119 | u = -(r3u*sin(long)) + r3v*cos(long) | 151 | |
88 | 120 | v = -r3u*cos(long)*sin(lat) - r3v*sin(long)*sin(lat) + r3w*cos(lat) | 152 | x = radius*sin(theta)*cos(phi) |
89 | 121 | 153 | y = radius*sin(theta)*sin(phi) | |
90 | 122 | end subroutine rotate2ll | 154 | z = radius*cos(theta) |
91 | 155 | |||
92 | 156 | end subroutine spherical_polar_2_cartesian | ||
93 | 157 | |||
94 | 158 | subroutine spherical_polar_2_cartesian_c(radius,theta,phi,x,y,z) bind(c) | ||
95 | 159 | !C-inter-operable subroutine for calculation of Cartesian coordinates | ||
96 | 160 | ! from spherical-polar coordinates. | ||
97 | 161 | implicit none | ||
98 | 162 | |||
99 | 163 | real(kind=c_double) :: radius !Distance from centre of sphere | ||
100 | 164 | real(kind=c_double) :: theta !Polar angle, in radians | ||
101 | 165 | real(kind=c_double) :: phi !Azimuthal angle, in radians | ||
102 | 166 | real(kind=c_double) :: x,y,z !Cartesian coordinates | ||
103 | 167 | |||
104 | 168 | real :: radius_f | ||
105 | 169 | real :: theta_f | ||
106 | 170 | real :: phi_f | ||
107 | 171 | real :: x_f,y_f,z_f | ||
108 | 172 | |||
109 | 173 | !Cast input variables to Fortran intrinsic types. | ||
110 | 174 | radius_f = real(radius) | ||
111 | 175 | theta_f = real(theta) | ||
112 | 176 | phi_f = real(phi) | ||
113 | 177 | |||
114 | 178 | !Convert coordinates | ||
115 | 179 | call spherical_polar_2_cartesian(radius_f,theta_f,phi_f,x_f,y_f,z_f) | ||
116 | 180 | |||
117 | 181 | !Cast output variables to C-inter-operable types. | ||
118 | 182 | x = real(x_f, kind=c_double) | ||
119 | 183 | y = real(y_f, kind=c_double) | ||
120 | 184 | z = real(z_f, kind=c_double) | ||
121 | 185 | |||
122 | 186 | end subroutine spherical_polar_2_cartesian_c | ||
123 | 187 | |||
124 | 188 | subroutine cartesian_2_spherical_polar(x,y,z,radius,theta,phi) | ||
125 | 189 | !Subroutine for calculation of spherical-polar coordinates from cartesian. | ||
126 | 190 | implicit none | ||
127 | 191 | |||
128 | 192 | real, intent(in) :: x,y,z !cartesian coordinates | ||
129 | 193 | real, intent(out) :: radius !Distance from centre of sphere | ||
130 | 194 | real, intent(out) :: theta !Polar angle, in radians | ||
131 | 195 | real, intent(out) :: phi !Azimuthal angle, in radians | ||
132 | 196 | |||
133 | 197 | radius = sqrt(x**2 + y**2 + z**2) | ||
134 | 198 | theta = acos(z/radius) | ||
135 | 199 | phi = atan2(y,x) | ||
136 | 200 | |||
137 | 201 | end subroutine cartesian_2_spherical_polar | ||
138 | 202 | |||
139 | 203 | subroutine cartesian_2_spherical_polar_c(x, y, z, radius, theta, phi) bind(c) | ||
140 | 204 | !C-inter-operable subroutine for calculation of spherical-polar coordinates | ||
141 | 205 | ! from Cartesian coordinates. | ||
142 | 206 | implicit none | ||
143 | 207 | |||
144 | 208 | real(kind=c_double) :: x,y,z !cartesian coordinates | ||
145 | 209 | real(kind=c_double) :: radius !Distance from centre of sphere | ||
146 | 210 | real(kind=c_double) :: theta !Polar angle, in radians | ||
147 | 211 | real(kind=c_double) :: phi !Azimuthal angle, in radians | ||
148 | 212 | |||
149 | 213 | real :: x_f,y_f,z_f | ||
150 | 214 | real :: radius_f | ||
151 | 215 | real :: theta_f | ||
152 | 216 | real :: phi_f | ||
153 | 217 | |||
154 | 218 | !Cast input variables to fortran intrinsic types. | ||
155 | 219 | x_f = real(x) | ||
156 | 220 | y_f = real(y) | ||
157 | 221 | z_f = real(z) | ||
158 | 222 | |||
159 | 223 | !Convert coordinates | ||
160 | 224 | call cartesian_2_spherical_polar(x_f, y_f, z_f, radius_f, theta_f, phi_f) | ||
161 | 225 | |||
162 | 226 | !Cast output variables to C-inter-operable types. | ||
163 | 227 | radius = real(radius_f, kind=c_double) | ||
164 | 228 | theta = real(theta_f, kind=c_double) | ||
165 | 229 | phi = real(phi_f, kind=c_double) | ||
166 | 230 | |||
167 | 231 | end subroutine cartesian_2_spherical_polar_c | ||
168 | 232 | |||
169 | 233 | subroutine spherical_polar_2_cartesian_field(spherical_polar_coordinate_field, & | ||
170 | 234 | cartesian_coordinate_field) | ||
171 | 235 | !Subroutine for conversion of a spherical-polar coordinate field into a cartesian | ||
172 | 236 | ! coordinate field. | ||
173 | 237 | implicit none | ||
174 | 238 | |||
175 | 239 | type(vector_field) :: spherical_polar_coordinate_field | ||
176 | 240 | type(vector_field) :: cartesian_coordinate_field | ||
177 | 241 | integer :: node | ||
178 | 242 | real, dimension(3) :: XYZ, RTP !arrays containing a single node's position vector | ||
179 | 243 | ! in cartesian & spherical-polar bases | ||
180 | 244 | |||
181 | 245 | do node=1,node_count(spherical_polar_coordinate_field) | ||
182 | 246 | RTP = node_val(spherical_polar_coordinate_field, node) | ||
183 | 247 | call spherical_polar_2_cartesian(RTP(1), RTP(2), RTP(3), XYZ(1), XYZ(2), XYZ(3)) | ||
184 | 248 | call set(cartesian_coordinate_field, node, XYZ) | ||
185 | 249 | enddo | ||
186 | 250 | |||
187 | 251 | end subroutine spherical_polar_2_cartesian_field | ||
188 | 252 | |||
189 | 253 | subroutine cartesian_2_spherical_polar_field(cartesian_coordinate_field, & | ||
190 | 254 | spherical_polar_coordinate_field) | ||
191 | 255 | !Subroutine for conversion of a cartesian coordinate field into a spherical-polar | ||
192 | 256 | ! coordinate field. | ||
193 | 257 | implicit none | ||
194 | 258 | |||
195 | 259 | type(vector_field) :: cartesian_coordinate_field | ||
196 | 260 | type(vector_field) :: spherical_polar_coordinate_field | ||
197 | 261 | integer :: node | ||
198 | 262 | real, dimension(3) :: XYZ, RTP !arrays containing a single node's position vector | ||
199 | 263 | ! components in cartesian & spherical-polar bases | ||
200 | 264 | |||
201 | 265 | do node=1,node_count(cartesian_coordinate_field) | ||
202 | 266 | XYZ = node_val(cartesian_coordinate_field, node) | ||
203 | 267 | call cartesian_2_spherical_polar(XYZ(1), XYZ(2), XYZ(3), RTP(1), RTP(2), RTP(3)) | ||
204 | 268 | call set(spherical_polar_coordinate_field, node, RTP) | ||
205 | 269 | enddo | ||
206 | 270 | |||
207 | 271 | end subroutine cartesian_2_spherical_polar_field | ||
208 | 272 | |||
209 | 273 | subroutine lon_lat_height_2_spherical_polar(longitude, latitude, height, & | ||
210 | 274 | radius, theta, phi, & | ||
211 | 275 | referenceRadius) | ||
212 | 276 | !Subroutine for conversion of longitude-latitude-height coordinates on a | ||
213 | 277 | ! sphere to spherical-polar coordinates. Longitude and latitude must be | ||
214 | 278 | ! in degrees, polar coordinates are returned into radians | ||
215 | 279 | implicit none | ||
216 | 280 | |||
217 | 281 | real, intent(in) :: longitude !in degrees | ||
218 | 282 | real, intent(in) :: latitude !in degrees | ||
219 | 283 | real, intent(in) :: height | ||
220 | 284 | real, intent(out) :: radius !Distance from centre of sphere | ||
221 | 285 | real, intent(out) :: theta !Polar angle, in radians | ||
222 | 286 | real, intent(out) :: phi !Azimuthal angle, in radians | ||
223 | 287 | real, intent(in), optional :: referenceRadius !Distance form the centre of | ||
224 | 288 | ! the sphere to its surface | ||
225 | 289 | real :: pi | ||
226 | 290 | |||
227 | 291 | pi=4*atan(1.0) | ||
228 | 292 | |||
229 | 293 | !Convert longitude to azimuthal angle and latitude in polar angle; in radians. | ||
230 | 294 | phi = longitude*pi/180. | ||
231 | 295 | theta = (90.- latitude)*pi/180. | ||
232 | 296 | |||
233 | 297 | !Convert height to distance from origin | ||
234 | 298 | ! Check if referenceRadius is present. If not use default value | ||
235 | 299 | ! of surface radius, available in global_parameters module | ||
236 | 300 | if(present(referenceRadius)) then | ||
237 | 301 | radius = height + referenceRadius | ||
238 | 302 | else | ||
239 | 303 | radius = height + surface_radius | ||
240 | 304 | endif | ||
241 | 305 | |||
242 | 306 | end subroutine lon_lat_height_2_spherical_polar | ||
243 | 307 | |||
244 | 308 | subroutine spherical_polar_2_lon_lat_height(radius, theta, phi, & | ||
245 | 309 | longitude, latitude, height, & | ||
246 | 310 | referenceRadius) | ||
247 | 311 | !Subroutine for conversion of spherical-polar coordinates to | ||
248 | 312 | ! longitude-latitude-height coordinates. The polar coordinates must | ||
249 | 313 | ! be given in radians. Longitude and latitude are returned in | ||
250 | 314 | ! degrees. If referenceRadius is specified, height is measured as the | ||
251 | 315 | ! radial distance relative to that radius, ie it is the distance relative to the | ||
252 | 316 | ! surface of the sphere. if referenceRadius is absent height is the distance | ||
253 | 317 | ! from the center of the sphere. | ||
254 | 318 | implicit none | ||
255 | 319 | |||
256 | 320 | real, intent(in) :: radius !Distance from centre of sphere | ||
257 | 321 | real, intent(in) :: theta !Polar angle, in radians | ||
258 | 322 | real, intent(in) :: phi !Azimuthal angle, in radians | ||
259 | 323 | real, intent(out) :: longitude !in degrees | ||
260 | 324 | real, intent(out) :: latitude !in degrees | ||
261 | 325 | real, intent(out) :: height | ||
262 | 326 | real, intent(in), optional :: referenceRadius !distance form the centre of | ||
263 | 327 | ! the sphere to its surface | ||
264 | 328 | real :: pi | ||
265 | 329 | |||
266 | 330 | pi=4*atan(1.0) | ||
267 | 331 | |||
268 | 332 | longitude = phi*180.0/pi | ||
269 | 333 | latitude = (pi/2 - theta)*180.0/pi | ||
270 | 334 | |||
271 | 335 | !If referenceRadius is present, subtract it from the radial distance | ||
272 | 336 | if(present(referenceRadius)) then | ||
273 | 337 | height = radius - referenceRadius | ||
274 | 338 | else | ||
275 | 339 | height = radius - surface_radius | ||
276 | 340 | endif | ||
277 | 341 | |||
278 | 342 | end subroutine spherical_polar_2_lon_lat_height | ||
279 | 343 | |||
280 | 344 | subroutine lon_lat_height_2_cartesian(longitude, latitude, height, & | ||
281 | 345 | x, y, z, & | ||
282 | 346 | referenceRadius) | ||
283 | 347 | !Subroutine for conversion of longitude-latitude-height coordinates into | ||
284 | 348 | ! Cartesian coordinates. If referenceRadius is specified, height is measured | ||
285 | 349 | ! as the radial distance relative to that radius, i.e. it is the distance | ||
286 | 350 | ! relative to the surface of the sphere. | ||
287 | 351 | implicit none | ||
288 | 352 | |||
289 | 353 | real, intent(in) :: longitude !in degrees | ||
290 | 354 | real, intent(in) :: latitude !in degrees | ||
291 | 355 | real, intent(in) :: height | ||
292 | 356 | real, intent(out) :: x,y,z !Cartesian coordinates | ||
293 | 357 | real, intent(in), optional :: referenceRadius | ||
294 | 358 | |||
295 | 359 | real :: radius !Distance from centre of sphere | ||
296 | 360 | real :: theta !Polar angle, in radians | ||
297 | 361 | real :: phi !Azimuthal angle, in radians | ||
298 | 362 | |||
299 | 363 | !Convert longitude-latitude-height into spherical-polar coordinates. | ||
300 | 364 | ! Check if referenceRadius is present. If not use default value | ||
301 | 365 | ! of surface radius, available in global_parameters module | ||
302 | 366 | if(present(referenceRadius)) then | ||
303 | 367 | call lon_lat_height_2_spherical_polar(longitude, latitude, height, & | ||
304 | 368 | radius, theta, phi, & | ||
305 | 369 | referenceRadius) | ||
306 | 370 | else | ||
307 | 371 | call lon_lat_height_2_spherical_polar(longitude, latitude, height, & | ||
308 | 372 | radius, theta, phi, & | ||
309 | 373 | surface_radius) | ||
310 | 374 | endif | ||
311 | 375 | |||
312 | 376 | |||
313 | 377 | !convert spherical-polar coordinates to Cartesian | ||
314 | 378 | call spherical_polar_2_cartesian(radius,theta,phi,x,y,z) | ||
315 | 379 | |||
316 | 380 | end subroutine lon_lat_height_2_cartesian | ||
317 | 381 | |||
318 | 382 | subroutine lon_lat_height_2_cartesian_c(longitude, latitude, height, & | ||
319 | 383 | x, y, z, & | ||
320 | 384 | referenceRadius) bind(c) | ||
321 | 385 | !C-inter-operable subroutine for conversion of longitude-latitude-height into | ||
322 | 386 | ! spherical-polar coordinates. referenceRadius must be specified, i.e. height | ||
323 | 387 | ! is always measured as the radial distance relative to that radius and denotes | ||
324 | 388 | ! the distance from the surface of the sphere. | ||
325 | 389 | implicit none | ||
326 | 390 | |||
327 | 391 | real(kind=c_double) :: longitude !Longitude, in radians. | ||
328 | 392 | real(kind=c_double) :: latitude !Latitude, in radians. | ||
329 | 393 | real(kind=c_double) :: height !Distance from surface of sphere. | ||
330 | 394 | real(kind=c_double) :: x,y,z !Cartesian coordinates. | ||
331 | 395 | real(kind=c_double) :: referenceRadius !Sphere radius. | ||
332 | 396 | |||
333 | 397 | real :: longitude_f | ||
334 | 398 | real :: latitude_f | ||
335 | 399 | real :: height_f | ||
336 | 400 | real :: x_f,y_f,z_f | ||
337 | 401 | real :: referenceRadius_f | ||
338 | 402 | |||
339 | 403 | !Cast input variables to Fortran intrinsic types. | ||
340 | 404 | longitude_f = real(longitude) | ||
341 | 405 | latitude_f = real(latitude) | ||
342 | 406 | height_f = real(height) | ||
343 | 407 | referenceRadius_f = real(referenceRadius) | ||
344 | 408 | |||
345 | 409 | !Convert coordinates | ||
346 | 410 | call lon_lat_height_2_cartesian(longitude_f, latitude_f, height_f, & | ||
347 | 411 | x_f, y_f, z_f, & | ||
348 | 412 | referenceRadius_f) | ||
349 | 413 | |||
350 | 414 | !Cast output variables to C-inter-operable types. | ||
351 | 415 | x = real(x_f, kind=c_double) | ||
352 | 416 | y = real(y_f, kind=c_double) | ||
353 | 417 | z = real(z_f, kind=c_double) | ||
354 | 418 | |||
355 | 419 | end subroutine lon_lat_height_2_cartesian_c | ||
356 | 420 | |||
357 | 421 | subroutine cartesian_2_lon_lat_height(x, y, z, longitude, latitude, height, & | ||
358 | 422 | referenceRadius) | ||
359 | 423 | !Subroutine for conversion of Cartesian coordinates into longitude-latitude-height | ||
360 | 424 | ! If referenceRadius is specified, height is measures as the radial distance relative | ||
361 | 425 | ! to that radius. | ||
362 | 426 | implicit none | ||
363 | 427 | |||
364 | 428 | real, intent(in) :: x,y,z !Cartesian coordinates | ||
365 | 429 | real, intent(out) :: longitude !in degrees | ||
366 | 430 | real, intent(out) :: latitude !in degrees | ||
367 | 431 | real, intent(out) :: height | ||
368 | 432 | real, intent(in), optional :: referenceRadius | ||
369 | 433 | real :: radius !Distance from centre of sphere | ||
370 | 434 | real :: theta !Polar angle, in radians | ||
371 | 435 | real :: phi !Azimuthal angle, in radians | ||
372 | 436 | |||
373 | 437 | !convert Cartesian coordinates to spherical-polar | ||
374 | 438 | call cartesian_2_spherical_polar(x,y,z,radius,theta,phi) | ||
375 | 439 | |||
376 | 440 | !Convert polar angle into latitude and azimuthal angle into longitude; in radians. | ||
377 | 441 | if(present(referenceRadius)) then | ||
378 | 442 | call spherical_polar_2_lon_lat_height(radius, theta, phi, & | ||
379 | 443 | longitude, latitude, height, & | ||
380 | 444 | referenceRadius) | ||
381 | 445 | else | ||
382 | 446 | call spherical_polar_2_lon_lat_height(radius, theta, phi, & | ||
383 | 447 | longitude, latitude, height) | ||
384 | 448 | endif | ||
385 | 449 | |||
386 | 450 | |||
387 | 451 | end subroutine cartesian_2_lon_lat_height | ||
388 | 452 | |||
389 | 453 | subroutine cartesian_2_lon_lat_height_c(x, y, z, longitude, latitude, height, & | ||
390 | 454 | referenceRadius) bind(c) | ||
391 | 455 | !C-inter-operable subroutine for conversion of Cartesian coordinates into | ||
392 | 456 | ! longitude-latitude-height. | ||
393 | 457 | implicit none | ||
394 | 458 | |||
395 | 459 | real(kind=c_double) :: x,y,z !Cartesian coordinates | ||
396 | 460 | real(kind=c_double) :: longitude !in degrees | ||
397 | 461 | real(kind=c_double) :: latitude !in degrees | ||
398 | 462 | real(kind=c_double) :: height | ||
399 | 463 | real(kind=c_double) :: referenceRadius | ||
400 | 464 | |||
401 | 465 | real :: x_f,y_f,z_f | ||
402 | 466 | real :: longitude_f | ||
403 | 467 | real :: latitude_f | ||
404 | 468 | real :: height_f | ||
405 | 469 | real :: referenceRadius_f | ||
406 | 470 | |||
407 | 471 | !Cast input variables to Fortran intrinsic types. | ||
408 | 472 | x_f = real(x) | ||
409 | 473 | y_f = real(y) | ||
410 | 474 | z_f = real(z) | ||
411 | 475 | |||
412 | 476 | referenceRadius_f = real(referenceRadius) | ||
413 | 477 | |||
414 | 478 | !Convert coordinates | ||
415 | 479 | call cartesian_2_lon_lat_height(x_f, y_f, z_f, longitude_f, latitude_f, height_f, & | ||
416 | 480 | referenceRadius_f) | ||
417 | 481 | |||
418 | 482 | !Cast output variables to C-inter-operable types. | ||
419 | 483 | longitude = real(longitude_f, kind=c_double) | ||
420 | 484 | latitude = real(latitude_f, kind=c_double) | ||
421 | 485 | height = real(height_f, kind=c_double) | ||
422 | 486 | |||
423 | 487 | end subroutine cartesian_2_lon_lat_height_c | ||
424 | 488 | |||
425 | 489 | subroutine transformation_matrix_cartesian_2_spherical_polar(xCoord, yCoord, zCoord, R, RT) | ||
426 | 490 | !Subroutine calculating transformation matrix for spherical-polar to/from Cartesian | ||
427 | 491 | ! tensor transformations. The routine also returns the transposed transformation matrix | ||
428 | 492 | implicit none | ||
429 | 493 | |||
430 | 494 | real, intent(in) :: xCoord !x-component of position vector | ||
431 | 495 | real, intent(in) :: yCoord !y-component of position vector | ||
432 | 496 | real, intent(in) :: zCoord !z-component of position vector | ||
433 | 497 | real, dimension(3,3), intent(out) :: R !Transformation matrix | ||
434 | 498 | real, dimension(3,3), intent(out) :: RT !Transposed transformation matrix | ||
435 | 499 | |||
436 | 500 | real :: radius !Distance from centre of sphere | ||
437 | 501 | real :: theta !Polar angle, in radians | ||
438 | 502 | real :: phi !Azimuthal angle, in radians | ||
439 | 503 | |||
440 | 504 | !Calculate position-vector components in spherical-polar basis | ||
441 | 505 | call cartesian_2_spherical_polar(xCoord, yCoord, zCoord, radius, theta, phi) | ||
442 | 506 | |||
443 | 507 | R(1,1)=sin(theta)*cos(phi) | ||
444 | 508 | R(1,2)=sin(theta)*sin(phi) | ||
445 | 509 | R(1,3)=cos(theta) | ||
446 | 510 | R(2,1)=cos(theta)*cos(phi) | ||
447 | 511 | R(2,2)=cos(theta)*sin(phi) | ||
448 | 512 | R(2,3)=-sin(theta) | ||
449 | 513 | R(3,1)=-sin(phi) | ||
450 | 514 | R(3,2)=cos(phi) | ||
451 | 515 | R(3,3)=0.0 | ||
452 | 516 | |||
453 | 517 | RT = TRANSPOSE(R) | ||
454 | 518 | |||
455 | 519 | end subroutine transformation_matrix_cartesian_2_spherical_polar | ||
456 | 520 | |||
457 | 521 | subroutine vector_spherical_polar_2_cartesian(radial, polar, azimuthal, & | ||
458 | 522 | radius, theta, phi, & | ||
459 | 523 | xComp, yComp, zComp, & | ||
460 | 524 | xCoord, yCoord, zCoord) | ||
461 | 525 | !Subroutine for vector change of basis: from spherical-polar to cartesian. The | ||
462 | 526 | ! coordinates of the position vector are also transformed | ||
463 | 527 | implicit none | ||
464 | 528 | |||
465 | 529 | real, intent(in) :: radial !Radial component of vector | ||
466 | 530 | real, intent(in) :: polar !Polar component of vector | ||
467 | 531 | real, intent(in) :: azimuthal !Azimuthal component of vector | ||
468 | 532 | real, intent(in) :: radius !Distance from centre of sphere | ||
469 | 533 | real, intent(in) :: theta !Polar angle, in radians | ||
470 | 534 | real, intent(in) :: phi !Azimuthal angle, in radians | ||
471 | 535 | real, intent(out) :: xComp !1st vector component in cartesian basis | ||
472 | 536 | real, intent(out) :: yComp !2nd vector component in cartesian basis | ||
473 | 537 | real, intent(out) :: zComp !3rd vector component in cartesian basis | ||
474 | 538 | real, intent(out) :: xCoord !1st vector component of position vector in cartesian basis | ||
475 | 539 | real, intent(out) :: yCoord !2nd vector component of position vector in cartesian basis | ||
476 | 540 | real, intent(out) :: zCoord !3rd vector component of position vector in cartesian basis | ||
477 | 541 | |||
478 | 542 | real, dimension(3) :: cartesianComponents | ||
479 | 543 | real, dimension(3,3) :: R !Transformation matrix | ||
480 | 544 | real, dimension(3,3) :: RT !Transposed transformation matrix | ||
481 | 545 | |||
482 | 546 | !Calculate position-vector components in cartesian system | ||
483 | 547 | call spherical_polar_2_cartesian(radius, theta, phi, xCoord, yCoord, zCoord) | ||
484 | 548 | |||
485 | 549 | !Calculate transformation matrix | ||
486 | 550 | call transformation_matrix_cartesian_2_spherical_polar(xCoord, yCoord, zCoord, R, RT) | ||
487 | 551 | |||
488 | 552 | !Evaluate vector components in Cartesian basis | ||
489 | 553 | cartesianComponents = matmul(RT,(/radial, polar, azimuthal/)) | ||
490 | 554 | xComp = cartesianComponents(1) | ||
491 | 555 | yComp = cartesianComponents(2) | ||
492 | 556 | zComp = cartesianComponents(3) | ||
493 | 557 | |||
494 | 558 | end subroutine vector_spherical_polar_2_cartesian | ||
495 | 559 | |||
496 | 560 | subroutine vector_cartesian_2_spherical_polar(xComp, yComp, zComp, & | ||
497 | 561 | xCoord, yCoord, zCoord, & | ||
498 | 562 | radial, polar, azimuthal, & | ||
499 | 563 | radius, theta, phi) | ||
500 | 564 | !Subroutine for vector change of basis: from Cartesian to spherical-polar. The | ||
501 | 565 | ! coordinates of the position vector are also transformed | ||
502 | 566 | implicit none | ||
503 | 567 | |||
504 | 568 | real, intent(in) :: xComp !1st vector component in cartesian basis | ||
505 | 569 | real, intent(in) :: yComp !2nd vector component in cartesian basis | ||
506 | 570 | real, intent(in) :: zComp !3rd vector component in cartesian basis | ||
507 | 571 | real, intent(in) :: xCoord !1st vector component of position vector in cartesian basis | ||
508 | 572 | real, intent(in) :: yCoord !2nd vector component of position vector in cartesian basis | ||
509 | 573 | real, intent(in) :: zCoord !3rd vector component of position vector in cartesian basis | ||
510 | 574 | real, intent(out) :: radial !Radial component of vector | ||
511 | 575 | real, intent(out) :: polar !Polar component of vector | ||
512 | 576 | real, intent(out) :: azimuthal !Azimuthal component of vector | ||
513 | 577 | real, intent(out) :: radius !Distance from centre of sphere | ||
514 | 578 | real, intent(out) :: theta !Polar angle, in radians | ||
515 | 579 | real, intent(out) :: phi !Azimuthal angle, in radians | ||
516 | 580 | |||
517 | 581 | real, dimension(3) :: sphericalPolarComponents | ||
518 | 582 | real, dimension(3,3) :: R !Transformation matrix | ||
519 | 583 | real, dimension(3,3) :: RT !Transposed transformation matrix | ||
520 | 584 | |||
521 | 585 | !Calculate position-vector components in spherical-polar system | ||
522 | 586 | call cartesian_2_spherical_polar(xCoord, yCoord, zCoord, radius, theta, phi) | ||
523 | 587 | |||
524 | 588 | !Calculate transformation matrix | ||
525 | 589 | call transformation_matrix_cartesian_2_spherical_polar(xCoord, yCoord, zCoord, R, RT) | ||
526 | 590 | |||
527 | 591 | !Evaluate vector components in spherical-polar basis | ||
528 | 592 | sphericalPolarComponents = matmul(R,(/xComp, yComp, zComp/)) | ||
529 | 593 | radial = sphericalPolarComponents(1) | ||
530 | 594 | polar = sphericalPolarComponents(2) | ||
531 | 595 | azimuthal = sphericalPolarComponents(3) | ||
532 | 596 | |||
533 | 597 | end subroutine vector_cartesian_2_spherical_polar | ||
534 | 598 | |||
535 | 599 | subroutine vector_lon_lat_height_2_cartesian(zonalComponent,& | ||
536 | 600 | meridionalComponent,& | ||
537 | 601 | verticalComponent, & | ||
538 | 602 | longitude, & | ||
539 | 603 | latitude, & | ||
540 | 604 | height, & | ||
541 | 605 | xComp, yComp, zComp, & | ||
542 | 606 | xCoord, yCoord, zCoord, & | ||
543 | 607 | referenceRadius) | ||
544 | 608 | !Subroutine for change of basis of a vector from meridional-zonal-vertical | ||
545 | 609 | ! components to cartesian components. | ||
546 | 610 | implicit none | ||
547 | 611 | |||
548 | 612 | real, intent(in) :: zonalComponent !Vector component tangential to parallel | ||
549 | 613 | real, intent(in) :: meridionalComponent !Vector component tangential to meridian | ||
550 | 614 | real, intent(in) :: verticalComponent !Vecor component in the vertical (radial) | ||
551 | 615 | real, intent(in) :: longitude | ||
552 | 616 | real, intent(in) :: latitude | ||
553 | 617 | real, intent(in) :: height | ||
554 | 618 | real, intent(out) :: xComp !1st vector component in cartesian basis | ||
555 | 619 | real, intent(out) :: yComp !2nd vector component in cartesian basis | ||
556 | 620 | real, intent(out) :: zComp !3rd vector component in cartesian basis | ||
557 | 621 | real, intent(out) :: xCoord !1st vector component of position vector | ||
558 | 622 | ! in Cartesian basis | ||
559 | 623 | real, intent(out) :: yCoord !2nd vector component of position vector | ||
560 | 624 | ! in Cartesian basis | ||
561 | 625 | real, intent(out) :: zCoord !3rd vector component of position vector | ||
562 | 626 | ! in Cartesian basis | ||
563 | 627 | real, intent(in), optional :: referenceRadius | ||
564 | 628 | real :: radial !Radial component of vector | ||
565 | 629 | real :: polar !Polar component of vector | ||
566 | 630 | real :: azimuthal !Azimuthal component of vector | ||
567 | 631 | real :: radius !Distance from centre of sphere | ||
568 | 632 | real :: theta !Polar angle, in radians | ||
569 | 633 | real :: phi !Azimuthal angle, in radians | ||
570 | 634 | |||
571 | 635 | !Convert zonal-meridional-vertical components to spherical-polar | ||
572 | 636 | azimuthal = zonalComponent | ||
573 | 637 | polar = -meridionalComponent | ||
574 | 638 | radial = verticalComponent | ||
575 | 639 | !Convert longitude-latitude-height to spherical-polar. | ||
576 | 640 | ! If referenceRadius is present then pass that to coordinate conversion routine, | ||
577 | 641 | ! height then is the radial distance of a point from the sphere with radius= | ||
578 | 642 | ! referenceRadius. Otherwise height is simply the distance from the Cartesian | ||
579 | 643 | ! coordinate origin. | ||
580 | 644 | if(present(referenceRadius)) then | ||
581 | 645 | call lon_lat_height_2_spherical_polar(longitude, latitude, height, & | ||
582 | 646 | radius, theta, phi, & | ||
583 | 647 | referenceRadius) | ||
584 | 648 | else | ||
585 | 649 | call lon_lat_height_2_spherical_polar(longitude, latitude, height, & | ||
586 | 650 | radius, theta, phi) | ||
587 | 651 | endif | ||
588 | 652 | !convert spherical-polar components to cartesian. | ||
589 | 653 | call vector_spherical_polar_2_cartesian(radial, polar, azimuthal, & | ||
590 | 654 | radius, theta, phi, & | ||
591 | 655 | xComp, yComp, zComp, & | ||
592 | 656 | xCoord, yCoord, zCoord) | ||
593 | 657 | |||
594 | 658 | end subroutine vector_lon_lat_height_2_cartesian | ||
595 | 659 | |||
596 | 660 | subroutine vector_cartesian_2_lon_lat_height(xComp, yComp, zComp, & | ||
597 | 661 | xCoord, yCoord, zCoord, & | ||
598 | 662 | zonalComponent,& | ||
599 | 663 | meridionalComponent,& | ||
600 | 664 | verticalComponent, & | ||
601 | 665 | longitude, & | ||
602 | 666 | latitude, & | ||
603 | 667 | height, & | ||
604 | 668 | referenceRadius) | ||
605 | 669 | !Subroutine for change of basis of a vector from cartesian to | ||
606 | 670 | ! meridional-zonal-vertical. | ||
607 | 671 | implicit none | ||
608 | 672 | |||
609 | 673 | real, intent(in) :: xComp !1st vector component in cartesian basis | ||
610 | 674 | real, intent(in) :: yComp !2nd vector component in cartesian basis | ||
611 | 675 | real, intent(in) :: zComp !3rd vector component in cartesian basis | ||
612 | 676 | real, intent(in) :: xCoord !1st vector component of position vector | ||
613 | 677 | ! in Cartesian basis | ||
614 | 678 | real, intent(in) :: yCoord !2nd vector component of position vector | ||
615 | 679 | ! in Cartesian basis | ||
616 | 680 | real, intent(in) :: zCoord !3rd vector component of position vector | ||
617 | 681 | ! in Cartesian basis | ||
618 | 682 | real, intent(out) :: zonalComponent !Vector component tangential to parallel | ||
619 | 683 | real, intent(out) :: meridionalComponent !Vector component tangential to meridian | ||
620 | 684 | real, intent(out) :: verticalComponent !Vector component in the vertical (radial) | ||
621 | 685 | real, intent(out) :: longitude | ||
622 | 686 | real, intent(out) :: latitude | ||
623 | 687 | real, intent(out) :: height | ||
624 | 688 | real, intent(in), optional :: referenceRadius | ||
625 | 689 | real :: radial !Radial component of vector | ||
626 | 690 | real :: polar !Polar component of vector | ||
627 | 691 | real :: azimuthal !Azimuthal component of vector | ||
628 | 692 | real :: radius !Distance from centre of sphere | ||
629 | 693 | real :: theta !Polar angle, in radians | ||
630 | 694 | real :: phi !Azimuthal angle, in radians | ||
631 | 695 | |||
632 | 696 | !Convert cartesian components to spherical-polar | ||
633 | 697 | call vector_cartesian_2_spherical_polar(xComp, yComp, zComp, & | ||
634 | 698 | xCoord, yCoord, zCoord, & | ||
635 | 699 | radial, polar, azimuthal, & | ||
636 | 700 | radius, theta, phi) | ||
637 | 701 | !Convert cartesian coordinates to longitude-latitude-radius | ||
638 | 702 | if(present(referenceRadius)) then | ||
639 | 703 | call cartesian_2_lon_lat_height(xCoord, yCoord, zCoord, & | ||
640 | 704 | longitude, latitude, height, & | ||
641 | 705 | referenceRadius) | ||
642 | 706 | else | ||
643 | 707 | call cartesian_2_lon_lat_height(xCoord, yCoord, zCoord, & | ||
644 | 708 | longitude, latitude, height) | ||
645 | 709 | endif | ||
646 | 710 | !Convert spherical-polar components to zonal-meridional-vertical | ||
647 | 711 | zonalComponent = azimuthal | ||
648 | 712 | meridionalComponent = -polar | ||
649 | 713 | verticalComponent = radial | ||
650 | 714 | |||
651 | 715 | end subroutine vector_cartesian_2_lon_lat_height | ||
652 | 716 | |||
653 | 717 | subroutine vector_lon_lat_height_2_cartesian_c(zonalComponent,& | ||
654 | 718 | meridionalComponent,& | ||
655 | 719 | verticalComponent, & | ||
656 | 720 | longitude, & | ||
657 | 721 | latitude, & | ||
658 | 722 | height, & | ||
659 | 723 | xComp, yComp, zComp, & | ||
660 | 724 | xCoord, yCoord, zCoord, & | ||
661 | 725 | referenceRadius) bind(c) | ||
662 | 726 | !C-interoperable subroutine for change of basis of a vector from | ||
663 | 727 | ! meridional-zonal-vertical components to cartesian components. Note that | ||
664 | 728 | ! unlike the Fortran version of the present routine, referenceRadius is | ||
665 | 729 | ! a mandatory argument. | ||
666 | 730 | implicit none | ||
667 | 731 | |||
668 | 732 | real(kind=c_double), intent(in) :: zonalComponent !Vector component tangential | ||
669 | 733 | ! to parallel | ||
670 | 734 | real(kind=c_double), intent(in) :: meridionalComponent !Vector component tangential | ||
671 | 735 | ! to meridian | ||
672 | 736 | real(kind=c_double), intent(in) :: verticalComponent !Vecor component in the | ||
673 | 737 | ! vertical (radial) | ||
674 | 738 | real(kind=c_double), intent(in) :: longitude | ||
675 | 739 | real(kind=c_double), intent(in) :: latitude | ||
676 | 740 | real(kind=c_double), intent(in) :: height | ||
677 | 741 | real(kind=c_double), intent(out) :: xComp !1st vector component in | ||
678 | 742 | ! cartesian basis | ||
679 | 743 | real(kind=c_double), intent(out) :: yComp !2nd vector component in | ||
680 | 744 | ! cartesian basis | ||
681 | 745 | real(kind=c_double), intent(out) :: zComp !3rd vector component in | ||
682 | 746 | ! cartesian basis | ||
683 | 747 | real(kind=c_double), intent(out) :: xCoord !1st vector component of | ||
684 | 748 | ! position vector in cartesian basis | ||
685 | 749 | real(kind=c_double), intent(out) :: yCoord !2nd vector component of | ||
686 | 750 | ! position vector in cartesian basis | ||
687 | 751 | real(kind=c_double), intent(out) :: zCoord !3rd vector component of | ||
688 | 752 | ! position vector in cartesian basis | ||
689 | 753 | real(kind=c_double), intent(in) :: referenceRadius | ||
690 | 754 | |||
691 | 755 | real :: zonalComponent_f !Vector component tangential to parallel | ||
692 | 756 | real :: meridionalComponent_f !Vector component tangential to meridian | ||
693 | 757 | real :: verticalComponent_f !Vecor component in the vertical (radial) | ||
694 | 758 | real :: longitude_f | ||
695 | 759 | real :: latitude_f | ||
696 | 760 | real :: height_f | ||
697 | 761 | real :: xComp_f !1st vector component in cartesian basis | ||
698 | 762 | real :: yComp_f !2nd vector component in cartesian basis | ||
699 | 763 | real :: zComp_f !3rd vector component in cartesian basis | ||
700 | 764 | real :: xCoord_f !1st vector component of position vector in cartesian basis | ||
701 | 765 | real :: yCoord_f !2nd vector component of position vector in cartesian basis | ||
702 | 766 | real :: zCoord_f !3rd vector component of position vector in cartesian basis | ||
703 | 767 | real :: referenceRadius_f | ||
704 | 768 | |||
705 | 769 | !Convert C-types in to Fortran intrinsic types. | ||
706 | 770 | zonalComponent_f = real(zonalComponent) | ||
707 | 771 | meridionalComponent_f = real(meridionalComponent) | ||
708 | 772 | verticalComponent_f = real(verticalComponent) | ||
709 | 773 | longitude_f = real(longitude) | ||
710 | 774 | latitude_f = real(latitude) | ||
711 | 775 | height_f = real(height) | ||
712 | 776 | referenceRadius_f = real(referenceRadius) | ||
713 | 777 | |||
714 | 778 | !Convert coordinates and components. | ||
715 | 779 | call vector_lon_lat_height_2_cartesian(zonalComponent_f,& | ||
716 | 780 | meridionalComponent_f,& | ||
717 | 781 | verticalComponent_f, & | ||
718 | 782 | longitude_f, & | ||
719 | 783 | latitude_f, & | ||
720 | 784 | height_f, & | ||
721 | 785 | xComp_f, yComp_f, zComp_f, & | ||
722 | 786 | xCoord_f, yCoord_f, zCoord_f, & | ||
723 | 787 | referenceRadius_f) | ||
724 | 788 | |||
725 | 789 | !Convert Fortran intrinsic types to C-types. | ||
726 | 790 | xComp = real(xComp_f, kind=c_double) | ||
727 | 791 | yComp = real(yComp_f, kind=c_double) | ||
728 | 792 | zComp = real(zComp_f, kind=c_double) | ||
729 | 793 | xCoord = real(xCoord_f, kind=c_double) | ||
730 | 794 | yCoord = real(yCoord_f, kind=c_double) | ||
731 | 795 | zCoord = real(zCoord_f, kind=c_double) | ||
732 | 796 | |||
733 | 797 | end subroutine vector_lon_lat_height_2_cartesian_c | ||
734 | 798 | |||
735 | 799 | subroutine vector_cartesian_2_lon_lat_height_c(xComp, yComp, zComp, & | ||
736 | 800 | xCoord, yCoord, zCoord, & | ||
737 | 801 | zonalComponent,& | ||
738 | 802 | meridionalComponent,& | ||
739 | 803 | verticalComponent, & | ||
740 | 804 | longitude, & | ||
741 | 805 | latitude, & | ||
742 | 806 | height, & | ||
743 | 807 | referenceRadius) bind (c) | ||
744 | 808 | !C inter-operable subroutine for change of basis of a vector from Cartesian to | ||
745 | 809 | ! meridional-zonal-vertical. Note that | ||
746 | 810 | ! unlike the Fortran version of the present routine, referenceRadius is | ||
747 | 811 | ! a mandatory argument. | ||
748 | 812 | implicit none | ||
749 | 813 | |||
750 | 814 | real(kind=c_double), intent(in) :: xComp !1st vector component in | ||
751 | 815 | ! cartesian basis | ||
752 | 816 | real(kind=c_double), intent(in) :: yComp !2nd vector component in | ||
753 | 817 | ! cartesian basis | ||
754 | 818 | real(kind=c_double), intent(in) :: zComp !3rd vector component in | ||
755 | 819 | ! cartesian basis | ||
756 | 820 | real(kind=c_double), intent(in) :: xCoord !1st vector component of position | ||
757 | 821 | ! vector in Cartesian basis | ||
758 | 822 | real(kind=c_double), intent(in) :: yCoord !2nd vector component of position | ||
759 | 823 | ! vector in Cartesian basis | ||
760 | 824 | real(kind=c_double), intent(in) :: zCoord !3rd vector component of position | ||
761 | 825 | ! vector in Cartesian basis | ||
762 | 826 | real(kind=c_double), intent(out) :: zonalComponent !Vector component tangential | ||
763 | 827 | ! to parallel | ||
764 | 828 | real(kind=c_double), intent(out) :: meridionalComponent !Vector component tangential | ||
765 | 829 | ! to meridian | ||
766 | 830 | real(kind=c_double), intent(out) :: verticalComponent !Vector component in the | ||
767 | 831 | ! vertical (radial) | ||
768 | 832 | real(kind=c_double), intent(out) :: longitude | ||
769 | 833 | real(kind=c_double), intent(out) :: latitude | ||
770 | 834 | real(kind=c_double), intent(out) :: height | ||
771 | 835 | real(kind=c_double), intent(in) :: referenceRadius | ||
772 | 836 | |||
773 | 837 | real :: xComp_f !1st vector component in cartesian basis | ||
774 | 838 | real :: yComp_f !2nd vector component in cartesian basis | ||
775 | 839 | real :: zComp_f !3rd vector component in cartesian basis | ||
776 | 840 | real :: xCoord_f !1st vector component of position vector | ||
777 | 841 | ! in Cartesian basis | ||
778 | 842 | real :: yCoord_f !2nd vector component of position vector | ||
779 | 843 | ! in Cartesian basis | ||
780 | 844 | real :: zCoord_f !3rd vector component of position vector | ||
781 | 845 | ! in Cartesian basis | ||
782 | 846 | real :: zonalComponent_f !Vector component tangential to parallel | ||
783 | 847 | real :: meridionalComponent_f !Vector component tangential to meridian | ||
784 | 848 | real :: verticalComponent_f !Vector component in the vertical (radial) | ||
785 | 849 | real :: longitude_f | ||
786 | 850 | real :: latitude_f | ||
787 | 851 | real :: height_f | ||
788 | 852 | real :: referenceRadius_f | ||
789 | 853 | |||
790 | 854 | !Convert C-types in to Fortran intrinsic types. | ||
791 | 855 | xComp_f = real(xComp) | ||
792 | 856 | yComp_f = real(yComp) | ||
793 | 857 | zComp_f = real(zComp) | ||
794 | 858 | xCoord_f = real(xCoord) | ||
795 | 859 | yCoord_f = real(yCoord) | ||
796 | 860 | zCoord_f = real(zCoord) | ||
797 | 861 | referenceRadius_f = real(referenceRadius) | ||
798 | 862 | |||
799 | 863 | !Convert coordinates and components. | ||
800 | 864 | call vector_cartesian_2_lon_lat_height(xComp_f, yComp_f, zComp_f, & | ||
801 | 865 | xCoord_f, yCoord_f, zCoord_f, & | ||
802 | 866 | zonalComponent_f, & | ||
803 | 867 | meridionalComponent_f, & | ||
804 | 868 | verticalComponent_f, & | ||
805 | 869 | longitude_f, & | ||
806 | 870 | latitude_f, & | ||
807 | 871 | height_f, & | ||
808 | 872 | referenceRadius_f) | ||
809 | 873 | |||
810 | 874 | !Convert Fortran intrinsic types to C-types. | ||
811 | 875 | zonalComponent = real(zonalComponent_f, kind=c_double) | ||
812 | 876 | meridionalComponent = real(meridionalComponent_f, kind=c_double) | ||
813 | 877 | verticalComponent = real(verticalComponent_f, kind=c_double) | ||
814 | 878 | longitude = real(longitude_f, kind=c_double) | ||
815 | 879 | latitude = real(latitude_f, kind=c_double) | ||
816 | 880 | height = real(height_f, kind=c_double) | ||
817 | 881 | |||
818 | 882 | end subroutine vector_cartesian_2_lon_lat_height_c | ||
819 | 883 | |||
820 | 884 | subroutine vector_spherical_polar_2_cartesian_field(spherical_polar_vector_field, & | ||
821 | 885 | spherical_polar_coordinate_field, & | ||
822 | 886 | cartesian_vector_field, & | ||
823 | 887 | cartesian_coordinate_field) | ||
824 | 888 | !Subroutine for change of basis of a cartesian vector field into a spherical-polar | ||
825 | 889 | ! vector field. This routine also converts and returns the position vector component | ||
826 | 890 | ! fields | ||
827 | 891 | implicit none | ||
828 | 892 | |||
829 | 893 | type(vector_field) :: spherical_polar_vector_field | ||
830 | 894 | type(vector_field) :: spherical_polar_coordinate_field | ||
831 | 895 | type(vector_field) :: cartesian_vector_field | ||
832 | 896 | type(vector_field) :: cartesian_coordinate_field | ||
833 | 897 | integer :: node | ||
834 | 898 | real, dimension(3) :: XYZ, RTP !arrays containing a signel node's position vector | ||
835 | 899 | ! in cartesian & spherical-polar bases | ||
836 | 900 | real, dimension(3) :: cartesianComponents, sphericalPolarComponents | ||
837 | 901 | |||
838 | 902 | assert(node_count(spherical_polar_coordinate_field) == node_count(cartesian_coordinate_field)) | ||
839 | 903 | |||
840 | 904 | do node=1,node_count(spherical_polar_coordinate_field) | ||
841 | 905 | RTP = node_val(spherical_polar_coordinate_field, node) | ||
842 | 906 | sphericalPolarComponents = node_val(spherical_polar_vector_field, node) | ||
843 | 907 | call vector_spherical_polar_2_cartesian(sphericalPolarComponents(1), & | ||
844 | 908 | sphericalPolarComponents(2), & | ||
845 | 909 | sphericalPolarComponents(3), & | ||
846 | 910 | RTP(1), RTP(2), RTP(3), & | ||
847 | 911 | cartesianComponents(1), & | ||
848 | 912 | cartesianComponents(2), & | ||
849 | 913 | cartesianComponents(3), & | ||
850 | 914 | XYZ(1), XYZ(2), XYZ(3)) | ||
851 | 915 | call set(cartesian_coordinate_field, node, XYZ) | ||
852 | 916 | call set(cartesian_vector_field, node, cartesianComponents) | ||
853 | 917 | enddo | ||
854 | 918 | end subroutine vector_spherical_polar_2_cartesian_field | ||
855 | 919 | |||
856 | 920 | subroutine vector_cartesian_2_spherical_polar_field(cartesian_vector_field, & | ||
857 | 921 | cartesian_coordinate_field, & | ||
858 | 922 | spherical_polar_vector_field, & | ||
859 | 923 | spherical_polar_coordinate_field) | ||
860 | 924 | !Subroutine for change of basis of a cartesian vector field into a spherical-polar | ||
861 | 925 | ! vector field. This routine also converts and returns the position vector component | ||
862 | 926 | ! fields | ||
863 | 927 | implicit none | ||
864 | 928 | |||
865 | 929 | type(vector_field) :: cartesian_vector_field | ||
866 | 930 | type(vector_field) :: cartesian_coordinate_field | ||
867 | 931 | type(vector_field) :: spherical_polar_vector_field | ||
868 | 932 | type(vector_field) :: spherical_polar_coordinate_field | ||
869 | 933 | integer :: node | ||
870 | 934 | real, dimension(3) :: XYZ, RTP !arrays containing a signel node's position vector | ||
871 | 935 | ! in cartesian & spherical-polar bases | ||
872 | 936 | real, dimension(3) :: cartesianComponents, sphericalPolarComponents | ||
873 | 937 | |||
874 | 938 | assert(node_count(spherical_polar_coordinate_field) == node_count(cartesian_coordinate_field) ) | ||
875 | 939 | |||
876 | 940 | do node=1,node_count(spherical_polar_coordinate_field) | ||
877 | 941 | XYZ = node_val(cartesian_coordinate_field, node) | ||
878 | 942 | cartesianComponents = node_val(cartesian_vector_field, node) | ||
879 | 943 | call vector_cartesian_2_spherical_polar(cartesianComponents(1), & | ||
880 | 944 | cartesianComponents(2), & | ||
881 | 945 | cartesianComponents(3), & | ||
882 | 946 | XYZ(1), XYZ(2), XYZ(3), & | ||
883 | 947 | sphericalPolarComponents(1), & | ||
884 | 948 | sphericalPolarComponents(2), & | ||
885 | 949 | sphericalPolarComponents(3), & | ||
886 | 950 | RTP(1), RTP(2), RTP(3)) | ||
887 | 951 | call set(spherical_polar_coordinate_field, node, RTP) | ||
888 | 952 | call set(spherical_polar_vector_field, node, sphericalPolarComponents) | ||
889 | 953 | enddo | ||
890 | 954 | end subroutine vector_cartesian_2_spherical_polar_field | ||
891 | 955 | |||
892 | 956 | subroutine tensor_spherical_polar_2_cartesian(sphericalPolarComponents, & | ||
893 | 957 | radius, theta, phi, & | ||
894 | 958 | cartesianComponents, & | ||
895 | 959 | xCoord, yCoord, zCoord) | ||
896 | 960 | !Subroutine for tensor change of basis: From spherical-polar to cartesian. The | ||
897 | 961 | ! coordinates of the position vector are also transformed. The tensor must | ||
898 | 962 | ! be a 3x3 tensor. | ||
899 | 963 | implicit none | ||
900 | 964 | |||
901 | 965 | real, intent(in), dimension(3,3) :: sphericalPolarComponents !Tensor | ||
902 | 966 | ! components in spherical-polar basis | ||
903 | 967 | real, intent(in) :: radius !Distance from centre of sphere | ||
904 | 968 | real, intent(in) :: theta !Polar angle, in radians | ||
905 | 969 | real, intent(in) :: phi !Azimuthal angle, in radians | ||
906 | 970 | real, intent(out), dimension(3,3) :: cartesianComponents !Tensor | ||
907 | 971 | ! components in Cartesian bisis | ||
908 | 972 | real, intent(out) :: xCoord !1st vector component of position vector | ||
909 | 973 | ! in cartesian basis | ||
910 | 974 | real, intent(out) :: yCoord !2nd vector component of position vector | ||
911 | 975 | ! in cartesian basis | ||
912 | 976 | real, intent(out) :: zCoord !3rd vector component of position vector | ||
913 | 977 | ! in cartesian basis | ||
914 | 978 | |||
915 | 979 | real, dimension(3,3) :: R !Transformation matrix | ||
916 | 980 | real, dimension(3,3) :: RT !Transposed transformation matrix | ||
917 | 981 | |||
918 | 982 | !Calculate position-vector components in cartesian system | ||
919 | 983 | call spherical_polar_2_cartesian(radius, theta, phi, xCoord, yCoord, zCoord) | ||
920 | 984 | |||
921 | 985 | !Calculate transformation matrix | ||
922 | 986 | call transformation_matrix_cartesian_2_spherical_polar(xCoord, yCoord, zCoord, R, RT) | ||
923 | 987 | |||
924 | 988 | !Evaluate vector components in Cartesian basis | ||
925 | 989 | cartesianComponents = matmul(matmul(RT, sphericalPolarComponents), R) | ||
926 | 990 | |||
927 | 991 | end subroutine tensor_spherical_polar_2_cartesian | ||
928 | 123 | 992 | ||
929 | 124 | subroutine higher_order_sphere_projection(positions, s_positions) | 993 | subroutine higher_order_sphere_projection(positions, s_positions) |
930 | 125 | !!< Given a P1 'positions' field and a Pn 's_positions' field, bends the | 994 | !!< Given a P1 'positions' field and a Pn 's_positions' field, bends the |
931 | @@ -186,17 +1055,106 @@ | |||
932 | 186 | 1055 | ||
933 | 187 | end function sphere_inward_normal_at_quad_face | 1056 | end function sphere_inward_normal_at_quad_face |
934 | 188 | 1057 | ||
935 | 1058 | function rotate_diagonal_to_cartesian_gi(positions, ele_number, diagonal) result(quad_val) | ||
936 | 1059 | ! Given the diagonal of a tensor in spherical coordinates, this function transforms the | ||
937 | 1060 | ! tensor components to a cartesian system at all quadrature points of an element. | ||
938 | 1061 | ! This result is given by R(diagonal)R^T where R is the transformation matrix. | ||
939 | 1062 | type(vector_field), intent(in) :: positions | ||
940 | 1063 | integer, intent(in) :: ele_number | ||
941 | 1064 | real, dimension(mesh_dim(positions),ele_ngi(positions,ele_number)), intent(in) :: diagonal | ||
942 | 1065 | real, dimension(mesh_dim(positions),ele_ngi(positions,ele_number)) :: X_quad | ||
943 | 1066 | real, dimension(mesh_dim(positions),mesh_dim(positions)) :: R, RT | ||
944 | 1067 | real, dimension(mesh_dim(positions),mesh_dim(positions),ele_ngi(positions,ele_number)) :: diagonal_T, quad_val | ||
945 | 1068 | real :: radius, theta, phi !distance form origin, polar angle, azimuthal angle | ||
946 | 1069 | integer :: i | ||
947 | 1070 | |||
948 | 1071 | assert(mesh_dim(positions)==3) | ||
949 | 1072 | |||
950 | 1073 | X_quad=ele_val_at_quad(positions, ele_number) | ||
951 | 1074 | |||
952 | 1075 | diagonal_T=0.0 | ||
953 | 1076 | do i=1,mesh_dim(positions) | ||
954 | 1077 | diagonal_T(i,i,:)=diagonal(i,:) | ||
955 | 1078 | end do | ||
956 | 1079 | |||
957 | 1080 | do i=1,ele_ngi(positions,ele_number) | ||
958 | 1081 | ! Calculate the spherical-polar coordinates of the point | ||
959 | 1082 | call cartesian_2_spherical_polar(X_quad(1,i), X_quad(2,i), X_quad(3,i), radius, theta, phi) | ||
960 | 1083 | |||
961 | 1084 | R(1,1)=sin(theta)*cos(phi) | ||
962 | 1085 | R(1,2)=cos(theta)*cos(phi) | ||
963 | 1086 | R(1,3)=-sin(phi) | ||
964 | 1087 | R(2,1)=sin(theta)*sin(phi) | ||
965 | 1088 | R(2,2)=cos(theta)*sin(phi) | ||
966 | 1089 | R(2,3)=cos(phi) | ||
967 | 1090 | R(3,1)=cos(theta) | ||
968 | 1091 | R(3,2)=-sin(theta) | ||
969 | 1092 | R(3,3)=0.0 | ||
970 | 1093 | |||
971 | 1094 | RT = TRANSPOSE(R) | ||
972 | 1095 | |||
973 | 1096 | quad_val(:,:,i)=matmul((matmul(R,diagonal_T(:,:,i))),RT) | ||
974 | 1097 | |||
975 | 1098 | end do | ||
976 | 1099 | |||
977 | 1100 | end function rotate_diagonal_to_cartesian_gi | ||
978 | 1101 | |||
979 | 1102 | function rotate_diagonal_to_cartesian_face(positions, face_number, diagonal) result(quad_val) | ||
980 | 1103 | ! Given the diagonal of a tensor in spherical coordinates, this function transforms the | ||
981 | 1104 | ! tensor components to a cartesian system at all quadrature points of an face. | ||
982 | 1105 | ! This result is given by R(diagonal)R^T where R is the transformation matrix. | ||
983 | 1106 | type(vector_field), intent(in) :: positions | ||
984 | 1107 | integer, intent(in) :: face_number | ||
985 | 1108 | real, dimension(positions%dim,face_ngi(positions,face_number)), intent(in) :: diagonal | ||
986 | 1109 | real, dimension(positions%dim,face_ngi(positions,face_number)) :: X_quad | ||
987 | 1110 | real, dimension(positions%dim,positions%dim) :: R, RT | ||
988 | 1111 | real, dimension(positions%dim,positions%dim,face_ngi(positions,face_number)) :: diagonal_T, quad_val | ||
989 | 1112 | real :: radius, theta, phi !distance form origin, polar angle, azimuthal angle | ||
990 | 1113 | integer :: i | ||
991 | 1114 | |||
992 | 1115 | assert(positions%dim==3) | ||
993 | 1116 | |||
994 | 1117 | X_quad=face_val_at_quad(positions, face_number) | ||
995 | 1118 | |||
996 | 1119 | diagonal_T=0.0 | ||
997 | 1120 | do i=1,positions%dim | ||
998 | 1121 | diagonal_T(i,i,:)=diagonal(i,:) | ||
999 | 1122 | end do | ||
1000 | 1123 | |||
1001 | 1124 | do i=1,ele_ngi(positions,face_number) | ||
1002 | 1125 | ! Calculate the spherical-polar coordinates of the point | ||
1003 | 1126 | call cartesian_2_spherical_polar(X_quad(1,i), X_quad(2,i), X_quad(3,i), radius, theta, phi) | ||
1004 | 1127 | |||
1005 | 1128 | R(1,1)=sin(theta)*cos(phi) | ||
1006 | 1129 | R(1,2)=cos(theta)*cos(phi) | ||
1007 | 1130 | R(1,3)=-sin(phi) | ||
1008 | 1131 | R(2,1)=sin(theta)*sin(phi) | ||
1009 | 1132 | R(2,2)=cos(theta)*sin(phi) | ||
1010 | 1133 | R(2,3)=cos(phi) | ||
1011 | 1134 | R(3,1)=cos(theta) | ||
1012 | 1135 | R(3,2)=-sin(theta) | ||
1013 | 1136 | R(3,3)=0.0 | ||
1014 | 1137 | |||
1015 | 1138 | RT = TRANSPOSE(R) | ||
1016 | 1139 | |||
1017 | 1140 | quad_val(:,:,i)=matmul((matmul(R,diagonal_T(:,:,i))),RT) | ||
1018 | 1141 | |||
1019 | 1142 | end do | ||
1020 | 1143 | |||
1021 | 1144 | end function rotate_diagonal_to_cartesian_face | ||
1022 | 1145 | |||
1023 | 189 | function rotate_diagonal_to_sphere_gi(positions, ele_number, diagonal) result(quad_val) | 1146 | function rotate_diagonal_to_sphere_gi(positions, ele_number, diagonal) result(quad_val) |
1027 | 190 | ! Given the diagonal of a tensor, this function rotates it to a spherical coordinate system. | 1147 | ! Given the diagonal of a tensor in cartesian coordinates, this function |
1028 | 191 | ! This result is given by R(diagonal)R^T where R is the matrix of Eigen vectors of the | 1148 | ! transforms the tensor components to a spherical-polar basis. This result |
1029 | 192 | ! spherical coordinate system. | 1149 | ! is given by R(diagonal)R^T where R is the matrix of Eigen vectors of the |
1030 | 1150 | ! spherical-polar basis, expressed in the cartesian basis. | ||
1031 | 193 | type(vector_field), intent(in) :: positions | 1151 | type(vector_field), intent(in) :: positions |
1032 | 194 | integer, intent(in) :: ele_number | 1152 | integer, intent(in) :: ele_number |
1033 | 195 | real, dimension(positions%dim,ele_ngi(positions,ele_number)), intent(in) :: diagonal | 1153 | real, dimension(positions%dim,ele_ngi(positions,ele_number)), intent(in) :: diagonal |
1034 | 196 | real, dimension(positions%dim,ele_ngi(positions,ele_number)) :: X_quad | 1154 | real, dimension(positions%dim,ele_ngi(positions,ele_number)) :: X_quad |
1035 | 197 | real, dimension(positions%dim,positions%dim) :: R, RT | 1155 | real, dimension(positions%dim,positions%dim) :: R, RT |
1036 | 198 | real, dimension(positions%dim,positions%dim,ele_ngi(positions,ele_number)) :: diagonal_T, quad_val | 1156 | real, dimension(positions%dim,positions%dim,ele_ngi(positions,ele_number)) :: diagonal_T, quad_val |
1038 | 199 | real :: rad, phi, theta | 1157 | real :: radius, theta, phi !distance form origin, polar angle, azimuthal angle |
1039 | 200 | integer :: i | 1158 | integer :: i |
1040 | 201 | 1159 | ||
1041 | 202 | assert(positions%dim==3) | 1160 | assert(positions%dim==3) |
1042 | @@ -209,22 +1167,21 @@ | |||
1043 | 209 | end do | 1167 | end do |
1044 | 210 | 1168 | ||
1045 | 211 | do i=1,ele_ngi(positions,ele_number) | 1169 | do i=1,ele_ngi(positions,ele_number) |
1049 | 212 | rad=sqrt(sum(X_quad(:,i)**2)) | 1170 | ! Calculate the spherical-polar coordinates of the point |
1050 | 213 | phi=atan2(X_quad(2,i),X_quad(1,i)) | 1171 | call cartesian_2_spherical_polar(X_quad(1,i), X_quad(2,i), X_quad(3,i), radius, theta, phi) |
1048 | 214 | theta=acos(X_quad(3,i)/rad) | ||
1051 | 215 | 1172 | ||
1056 | 216 | R(1,1)=-sin(phi) | 1173 | R(1,1)=sin(theta)*cos(phi) |
1057 | 217 | R(1,2)=cos(theta)*cos(phi) | 1174 | R(1,2)=sin(theta)*sin(phi) |
1058 | 218 | R(1,3)=sin(theta)*cos(phi) | 1175 | R(1,3)=cos(theta) |
1059 | 219 | R(2,1)=cos(phi) | 1176 | R(2,1)=cos(theta)*cos(phi) |
1060 | 220 | R(2,2)=cos(theta)*sin(phi) | 1177 | R(2,2)=cos(theta)*sin(phi) |
1068 | 221 | R(2,3)=sin(theta)*sin(phi) | 1178 | R(2,3)=-sin(theta) |
1069 | 222 | R(3,1)=0 | 1179 | R(3,1)=-sin(phi) |
1070 | 223 | R(3,2)=-sin(theta) | 1180 | R(3,2)=cos(phi) |
1071 | 224 | R(3,3)=cos(theta) | 1181 | R(3,3)=0.0 |
1072 | 225 | 1182 | ||
1073 | 226 | RT=R | 1183 | RT = TRANSPOSE(R) |
1074 | 227 | call invert(RT) | 1184 | |
1075 | 228 | quad_val(:,:,i)=matmul((matmul(R,diagonal_T(:,:,i))),RT) | 1185 | quad_val(:,:,i)=matmul((matmul(R,diagonal_T(:,:,i))),RT) |
1076 | 229 | 1186 | ||
1077 | 230 | end do | 1187 | end do |
1078 | @@ -232,16 +1189,17 @@ | |||
1079 | 232 | end function rotate_diagonal_to_sphere_gi | 1189 | end function rotate_diagonal_to_sphere_gi |
1080 | 233 | 1190 | ||
1081 | 234 | function rotate_diagonal_to_sphere_face(positions, face_number, diagonal) result(quad_val) | 1191 | function rotate_diagonal_to_sphere_face(positions, face_number, diagonal) result(quad_val) |
1085 | 235 | ! Given the diagonal of a tensor, this function rotates it to a spherical coordinate system. | 1192 | ! Given the diagonal of a tensor in cartesian coordinates, this function |
1086 | 236 | ! This result is given by R(diagonal)R^T where R is the matrix of Eigen vectors of the | 1193 | ! transforms the tensor components to a spherical-polar basis. This result |
1087 | 237 | ! spherical coordinate system. | 1194 | ! is given by R(diagonal)R^T ! where R is the matrix of Eigen vectors of the |
1088 | 1195 | ! spherical-polar basis, expressed in the cartesian basis. | ||
1089 | 238 | type(vector_field), intent(in) :: positions | 1196 | type(vector_field), intent(in) :: positions |
1090 | 239 | integer, intent(in) :: face_number | 1197 | integer, intent(in) :: face_number |
1091 | 240 | real, dimension(positions%dim,face_ngi(positions,face_number)), intent(in) :: diagonal | 1198 | real, dimension(positions%dim,face_ngi(positions,face_number)), intent(in) :: diagonal |
1092 | 241 | real, dimension(positions%dim,face_ngi(positions,face_number)) :: X_quad | 1199 | real, dimension(positions%dim,face_ngi(positions,face_number)) :: X_quad |
1093 | 242 | real, dimension(positions%dim,positions%dim) :: R, RT | 1200 | real, dimension(positions%dim,positions%dim) :: R, RT |
1094 | 243 | real, dimension(positions%dim,positions%dim,face_ngi(positions,face_number)) :: diagonal_T, quad_val | 1201 | real, dimension(positions%dim,positions%dim,face_ngi(positions,face_number)) :: diagonal_T, quad_val |
1096 | 244 | real :: rad, phi, theta | 1202 | real :: radius, theta, phi !distance form origin, polar angle, azimuthal angle |
1097 | 245 | integer :: i | 1203 | integer :: i |
1098 | 246 | 1204 | ||
1099 | 247 | assert(positions%dim==3) | 1205 | assert(positions%dim==3) |
1100 | @@ -254,22 +1212,21 @@ | |||
1101 | 254 | end do | 1212 | end do |
1102 | 255 | 1213 | ||
1103 | 256 | do i=1,face_ngi(positions,face_number) | 1214 | do i=1,face_ngi(positions,face_number) |
1107 | 257 | rad=sqrt(sum(X_quad(:,i)**2)) | 1215 | ! Calculate the spherical-polar coordinates of the point |
1108 | 258 | phi=atan2(X_quad(2,i),X_quad(1,i)) | 1216 | call cartesian_2_spherical_polar(X_quad(1,i), X_quad(2,i), X_quad(3,i), radius, theta, phi) |
1106 | 259 | theta=acos(X_quad(3,i)/rad) | ||
1109 | 260 | 1217 | ||
1114 | 261 | R(1,1)=-sin(phi) | 1218 | R(1,1)=sin(theta)*cos(phi) |
1115 | 262 | R(1,2)=cos(theta)*cos(phi) | 1219 | R(1,2)=sin(theta)*sin(phi) |
1116 | 263 | R(1,3)=sin(theta)*cos(phi) | 1220 | R(1,3)=cos(theta) |
1117 | 264 | R(2,1)=cos(phi) | 1221 | R(2,1)=cos(theta)*cos(phi) |
1118 | 265 | R(2,2)=cos(theta)*sin(phi) | 1222 | R(2,2)=cos(theta)*sin(phi) |
1126 | 266 | R(2,3)=sin(theta)*sin(phi) | 1223 | R(2,3)=-sin(theta) |
1127 | 267 | R(3,1)=0 | 1224 | R(3,1)=-sin(phi) |
1128 | 268 | R(3,2)=-sin(theta) | 1225 | R(3,2)=cos(phi) |
1129 | 269 | R(3,3)=cos(theta) | 1226 | R(3,3)=0.0 |
1130 | 270 | 1227 | ||
1131 | 271 | RT=R | 1228 | RT = TRANSPOSE(R) |
1132 | 272 | call invert(RT) | 1229 | |
1133 | 273 | quad_val(:,:,i)=matmul((matmul(R,diagonal_T(:,:,i))),RT) | 1230 | quad_val(:,:,i)=matmul((matmul(R,diagonal_T(:,:,i))),RT) |
1134 | 274 | 1231 | ||
1135 | 275 | end do | 1232 | end do |
1136 | @@ -292,7 +1249,7 @@ | |||
1137 | 292 | type(vector_field), pointer :: position | 1249 | type(vector_field), pointer :: position |
1138 | 293 | type(vector_field) :: u_position | 1250 | type(vector_field) :: u_position |
1139 | 294 | real, dimension(u%dim) :: x, node_normal, node_tangent1, node_tangent2 | 1251 | real, dimension(u%dim) :: x, node_normal, node_tangent1, node_tangent2 |
1141 | 295 | real :: phi, theta, rad | 1252 | real :: radius, theta, phi !distance form origin, polar angle, azimuthal angle |
1142 | 296 | 1253 | ||
1143 | 297 | ewrite(1,*) "Inside rotate_ct_m_sphere" | 1254 | ewrite(1,*) "Inside rotate_ct_m_sphere" |
1144 | 298 | 1255 | ||
1145 | @@ -314,15 +1271,15 @@ | |||
1146 | 314 | 1271 | ||
1147 | 315 | do node=1, node_count(u) | 1272 | do node=1, node_count(u) |
1148 | 316 | 1273 | ||
1149 | 1274 | !Extract the cartesian coordinates of the node. | ||
1150 | 317 | x=node_val(u_position, node) | 1275 | x=node_val(u_position, node) |
1151 | 318 | 1276 | ||
1155 | 319 | rad=sqrt(sum(x(:)**2)) | 1277 | !Calculate spherical-polar coordinates. |
1156 | 320 | phi=atan2(x(2),x(1)) | 1278 | call cartesian_2_spherical_polar(x(1),x(2),x(3),radius,theta,phi) |
1154 | 321 | theta=acos(x(3)/rad) | ||
1157 | 322 | 1279 | ||
1158 | 323 | node_normal=(/sin(theta)*cos(phi),sin(theta)*sin(phi),cos(theta)/) | 1280 | node_normal=(/sin(theta)*cos(phi),sin(theta)*sin(phi),cos(theta)/) |
1161 | 324 | node_tangent1=(/-sin(phi),cos(phi),0.0/) | 1281 | node_tangent1=(/cos(theta)*cos(phi),cos(theta)*sin(phi),-sin(theta)/) |
1162 | 325 | node_tangent2=(/cos(theta)*cos(phi),cos(theta)*sin(phi),-sin(theta)/) | 1282 | node_tangent2=(/-sin(phi),cos(phi),0.0/) |
1163 | 326 | 1283 | ||
1164 | 327 | call set(sphere_normal, node, node_normal) | 1284 | call set(sphere_normal, node, node_normal) |
1165 | 328 | call set(sphere_tangent1, node, node_tangent1) | 1285 | call set(sphere_tangent1, node, node_tangent1) |
1166 | @@ -341,9 +1298,9 @@ | |||
1167 | 341 | do j=1, size(rowcol) | 1298 | do j=1, size(rowcol) |
1168 | 342 | rotated_node=rowcol(j) | 1299 | rotated_node=rowcol(j) |
1169 | 343 | ! construct local rotation matrix | 1300 | ! construct local rotation matrix |
1173 | 344 | local_rotation(1,:)=node_val(sphere_tangent1, rotated_node) | 1301 | local_rotation(1,:)=node_val(sphere_normal, rotated_node) |
1174 | 345 | local_rotation(2,:)=node_val(sphere_tangent2, rotated_node) | 1302 | local_rotation(2,:)=node_val(sphere_tangent1, rotated_node) |
1175 | 346 | local_rotation(3,:)=node_val(sphere_normal, rotated_node) | 1303 | local_rotation(3,:)=node_val(sphere_tangent2, rotated_node) |
1176 | 347 | 1304 | ||
1177 | 348 | ! look up ct_m values of row i, column rowcol(j) in xyz orientation | 1305 | ! look up ct_m values of row i, column rowcol(j) in xyz orientation |
1178 | 349 | do k=1, blocks(ct_m,2) | 1306 | do k=1, blocks(ct_m,2) |
1179 | @@ -431,7 +1388,7 @@ | |||
1180 | 431 | type(halo_type), pointer:: halo | 1388 | type(halo_type), pointer:: halo |
1181 | 432 | type(vector_field) :: sphere_normal, sphere_tangent1, sphere_tangent2 | 1389 | type(vector_field) :: sphere_normal, sphere_tangent1, sphere_tangent2 |
1182 | 433 | real, dimension(u%dim) :: x, node_normal, node_tangent1, node_tangent2 | 1390 | real, dimension(u%dim) :: x, node_normal, node_tangent1, node_tangent2 |
1184 | 434 | real :: rad, phi, theta | 1391 | real :: radius, theta, phi !distance form origin, polar angle, azimuthal angle |
1185 | 435 | real, dimension(u%dim, u%dim):: local_rotation | 1392 | real, dimension(u%dim, u%dim):: local_rotation |
1186 | 436 | integer, dimension(:), allocatable:: dnnz, onnz | 1393 | integer, dimension(:), allocatable:: dnnz, onnz |
1187 | 437 | integer:: node, nodes, mynodes | 1394 | integer:: node, nodes, mynodes |
1188 | @@ -477,15 +1434,15 @@ | |||
1189 | 477 | 1434 | ||
1190 | 478 | do node=1, mynodes | 1435 | do node=1, mynodes |
1191 | 479 | 1436 | ||
1192 | 1437 | !Extract the cartesian coordinates of the node. | ||
1193 | 480 | x=node_val(u_position, node) | 1438 | x=node_val(u_position, node) |
1194 | 481 | 1439 | ||
1198 | 482 | rad=sqrt(sum(x(:)**2)) | 1440 | !Calculate spherical-polar coordinates. |
1199 | 483 | phi=atan2(x(2),x(1)) | 1441 | call cartesian_2_spherical_polar(x(1),x(2),x(3),radius,theta,phi) |
1197 | 484 | theta=acos(x(3)/rad) | ||
1200 | 485 | 1442 | ||
1201 | 486 | node_normal=(/sin(theta)*cos(phi),sin(theta)*sin(phi),cos(theta)/) | 1443 | node_normal=(/sin(theta)*cos(phi),sin(theta)*sin(phi),cos(theta)/) |
1204 | 487 | node_tangent1=(/-sin(phi),cos(phi),0.0/) | 1444 | node_tangent1=(/cos(theta)*cos(phi),cos(theta)*sin(phi),-sin(theta)/) |
1205 | 488 | node_tangent2=(/cos(theta)*cos(phi),cos(theta)*sin(phi),-sin(theta)/) | 1445 | node_tangent2=(/-sin(phi),cos(phi),0.0/) |
1206 | 489 | 1446 | ||
1207 | 490 | call set(sphere_normal, node, node_normal) | 1447 | call set(sphere_normal, node, node_normal) |
1208 | 491 | call set(sphere_tangent1, node, node_tangent1) | 1448 | call set(sphere_tangent1, node, node_tangent1) |
1209 | @@ -494,9 +1451,9 @@ | |||
1210 | 494 | end do | 1451 | end do |
1211 | 495 | 1452 | ||
1212 | 496 | do node=1, mynodes | 1453 | do node=1, mynodes |
1216 | 497 | local_rotation(:,1)=node_val(sphere_tangent1, node) | 1454 | local_rotation(:,1)=node_val(sphere_normal, node) |
1217 | 498 | local_rotation(:,2)=node_val(sphere_tangent2, node) | 1455 | local_rotation(:,2)=node_val(sphere_tangent1, node) |
1218 | 499 | local_rotation(:,3)=node_val(sphere_normal, node) | 1456 | local_rotation(:,3)=node_val(sphere_tangent2, node) |
1219 | 500 | 1457 | ||
1220 | 501 | call addto(rotation_sphere, node, node, local_rotation) | 1458 | call addto(rotation_sphere, node, node, local_rotation) |
1221 | 502 | end do | 1459 | end do |
1222 | @@ -515,7 +1472,6 @@ | |||
1223 | 515 | type(vector_field), intent(inout):: vfield | 1472 | type(vector_field), intent(inout):: vfield |
1224 | 516 | type(state_type), intent(inout):: state | 1473 | type(state_type), intent(inout):: state |
1225 | 517 | 1474 | ||
1226 | 518 | type(vector_field), pointer:: u | ||
1227 | 519 | type(vector_field):: result | 1475 | type(vector_field):: result |
1228 | 520 | type(petsc_csr_matrix), pointer:: rotation_sphere | 1476 | type(petsc_csr_matrix), pointer:: rotation_sphere |
1229 | 521 | integer :: stat | 1477 | integer :: stat |
1230 | @@ -523,8 +1479,7 @@ | |||
1231 | 523 | rotation_sphere => extract_petsc_csr_matrix(state, "RotationMatrixSphere", stat=stat) | 1479 | rotation_sphere => extract_petsc_csr_matrix(state, "RotationMatrixSphere", stat=stat) |
1232 | 524 | if (stat/=0) then | 1480 | if (stat/=0) then |
1233 | 525 | allocate(rotation_sphere) | 1481 | allocate(rotation_sphere) |
1236 | 526 | u => extract_vector_field(state, "Velocity") | 1482 | call create_rotation_matrix_sphere(rotation_sphere, vfield, state) |
1235 | 527 | call create_rotation_matrix_sphere(rotation_sphere, u, state) | ||
1237 | 528 | call insert(state, rotation_sphere, "RotationMatrixSphere") | 1483 | call insert(state, rotation_sphere, "RotationMatrixSphere") |
1238 | 529 | end if | 1484 | end if |
1239 | 530 | 1485 | ||
1240 | @@ -551,8 +1506,7 @@ | |||
1241 | 551 | rotation_sphere => extract_petsc_csr_matrix(state, "RotationMatrixSphere", stat=stat) | 1506 | rotation_sphere => extract_petsc_csr_matrix(state, "RotationMatrixSphere", stat=stat) |
1242 | 552 | if (stat/=0) then | 1507 | if (stat/=0) then |
1243 | 553 | allocate(rotation_sphere) | 1508 | allocate(rotation_sphere) |
1246 | 554 | u => extract_vector_field(state, "Velocity") | 1509 | call create_rotation_matrix_sphere(rotation_sphere, vfield, state) |
1245 | 555 | call create_rotation_matrix_sphere(rotation_sphere, u, state) | ||
1247 | 556 | call insert(state, rotation_sphere, "RotationMatrixSphere") | 1510 | call insert(state, rotation_sphere, "RotationMatrixSphere") |
1248 | 557 | end if | 1511 | end if |
1249 | 558 | 1512 | ||
1250 | 559 | 1513 | ||
1251 | === added file 'femtools/doc/coordinate_transformations.png' | |||
1252 | 560 | Binary files femtools/doc/coordinate_transformations.png 1970-01-01 00:00:00 +0000 and femtools/doc/coordinate_transformations.png 2012-10-19 14:09:23 +0000 differ | 1514 | Binary files femtools/doc/coordinate_transformations.png 1970-01-01 00:00:00 +0000 and femtools/doc/coordinate_transformations.png 2012-10-19 14:09:23 +0000 differ |
1253 | === modified file 'femtools/doc/femtools_manual.pdf' | |||
1254 | --- femtools/doc/femtools_manual.pdf 2012-04-25 16:21:34 +0000 | |||
1255 | +++ femtools/doc/femtools_manual.pdf 2012-10-19 14:09:23 +0000 | |||
1256 | @@ -229,670 +229,676 @@ | |||
1257 | 229 | (Topological and data dimension) | 229 | (Topological and data dimension) |
1258 | 230 | endobj | 230 | endobj |
1259 | 231 | 153 0 obj | 231 | 153 0 obj |
1261 | 232 | << /S /GoTo /D (chapter.9) >> | 232 | << /S /GoTo /D (section.8.6) >> |
1262 | 233 | endobj | 233 | endobj |
1263 | 234 | 156 0 obj | 234 | 156 0 obj |
1265 | 235 | (State dictionaries) | 235 | (Changing coordinates and bases) |
1266 | 236 | endobj | 236 | endobj |
1267 | 237 | 157 0 obj | 237 | 157 0 obj |
1269 | 238 | << /S /GoTo /D (section.9.1) >> | 238 | << /S /GoTo /D (chapter.9) >> |
1270 | 239 | endobj | 239 | endobj |
1271 | 240 | 160 0 obj | 240 | 160 0 obj |
1273 | 241 | (Inserting and extracting objects in states) | 241 | (State dictionaries) |
1274 | 242 | endobj | 242 | endobj |
1275 | 243 | 161 0 obj | 243 | 161 0 obj |
1277 | 244 | << /S /GoTo /D (section.9.2) >> | 244 | << /S /GoTo /D (section.9.1) >> |
1278 | 245 | endobj | 245 | endobj |
1279 | 246 | 164 0 obj | 246 | 164 0 obj |
1281 | 247 | (Aliased fields and listing the same field in multiple state dictionaries) | 247 | (Inserting and extracting objects in states) |
1282 | 248 | endobj | 248 | endobj |
1283 | 249 | 165 0 obj | 249 | 165 0 obj |
1285 | 250 | << /S /GoTo /D (chapter.10) >> | 250 | << /S /GoTo /D (section.9.2) >> |
1286 | 251 | endobj | 251 | endobj |
1287 | 252 | 168 0 obj | 252 | 168 0 obj |
1289 | 253 | (Reference counting) | 253 | (Aliased fields and listing the same field in multiple state dictionaries) |
1290 | 254 | endobj | 254 | endobj |
1291 | 255 | 169 0 obj | 255 | 169 0 obj |
1293 | 256 | << /S /GoTo /D (section.10.1) >> | 256 | << /S /GoTo /D (chapter.10) >> |
1294 | 257 | endobj | 257 | endobj |
1295 | 258 | 172 0 obj | 258 | 172 0 obj |
1297 | 259 | (Creating and destroying references) | 259 | (Reference counting) |
1298 | 260 | endobj | 260 | endobj |
1299 | 261 | 173 0 obj | 261 | 173 0 obj |
1301 | 262 | << /S /GoTo /D (subsection.10.1.1) >> | 262 | << /S /GoTo /D (section.10.1) >> |
1302 | 263 | endobj | 263 | endobj |
1303 | 264 | 176 0 obj | 264 | 176 0 obj |
1305 | 265 | (Allocate) | 265 | (Creating and destroying references) |
1306 | 266 | endobj | 266 | endobj |
1307 | 267 | 177 0 obj | 267 | 177 0 obj |
1309 | 268 | << /S /GoTo /D (subsection.10.1.2) >> | 268 | << /S /GoTo /D (subsection.10.1.1) >> |
1310 | 269 | endobj | 269 | endobj |
1311 | 270 | 180 0 obj | 270 | 180 0 obj |
1313 | 271 | (Deallocate) | 271 | (Allocate) |
1314 | 272 | endobj | 272 | endobj |
1315 | 273 | 181 0 obj | 273 | 181 0 obj |
1317 | 274 | << /S /GoTo /D (subsection.10.1.3) >> | 274 | << /S /GoTo /D (subsection.10.1.2) >> |
1318 | 275 | endobj | 275 | endobj |
1319 | 276 | 184 0 obj | 276 | 184 0 obj |
1321 | 277 | (Inserting into state) | 277 | (Deallocate) |
1322 | 278 | endobj | 278 | endobj |
1323 | 279 | 185 0 obj | 279 | 185 0 obj |
1325 | 280 | << /S /GoTo /D (subsection.10.1.4) >> | 280 | << /S /GoTo /D (subsection.10.1.3) >> |
1326 | 281 | endobj | 281 | endobj |
1327 | 282 | 188 0 obj | 282 | 188 0 obj |
1329 | 283 | (Extracting from states) | 283 | (Inserting into state) |
1330 | 284 | endobj | 284 | endobj |
1331 | 285 | 189 0 obj | 285 | 189 0 obj |
1333 | 286 | << /S /GoTo /D (subsection.10.1.5) >> | 286 | << /S /GoTo /D (subsection.10.1.4) >> |
1334 | 287 | endobj | 287 | endobj |
1335 | 288 | 192 0 obj | 288 | 192 0 obj |
1337 | 289 | (Incref) | 289 | (Extracting from states) |
1338 | 290 | endobj | 290 | endobj |
1339 | 291 | 193 0 obj | 291 | 193 0 obj |
1341 | 292 | << /S /GoTo /D (section.10.2) >> | 292 | << /S /GoTo /D (subsection.10.1.5) >> |
1342 | 293 | endobj | 293 | endobj |
1343 | 294 | 196 0 obj | 294 | 196 0 obj |
1345 | 295 | (Creating new reference counted data types) | 295 | (Incref) |
1346 | 296 | endobj | 296 | endobj |
1347 | 297 | 197 0 obj | 297 | 197 0 obj |
1349 | 298 | << /S /GoTo /D (section.10.3) >> | 298 | << /S /GoTo /D (section.10.2) >> |
1350 | 299 | endobj | 299 | endobj |
1351 | 300 | 200 0 obj | 300 | 200 0 obj |
1353 | 301 | (Memory accounting diagnostics) | 301 | (Creating new reference counted data types) |
1354 | 302 | endobj | 302 | endobj |
1355 | 303 | 201 0 obj | 303 | 201 0 obj |
1357 | 304 | << /S /GoTo /D (subsection.10.3.1) >> | 304 | << /S /GoTo /D (section.10.3) >> |
1358 | 305 | endobj | 305 | endobj |
1359 | 306 | 204 0 obj | 306 | 204 0 obj |
1361 | 307 | (Memory statistics in the .stat file) | 307 | (Memory accounting diagnostics) |
1362 | 308 | endobj | 308 | endobj |
1363 | 309 | 205 0 obj | 309 | 205 0 obj |
1365 | 310 | << /S /GoTo /D (part.3) >> | 310 | << /S /GoTo /D (subsection.10.3.1) >> |
1366 | 311 | endobj | 311 | endobj |
1367 | 312 | 208 0 obj | 312 | 208 0 obj |
1369 | 313 | (III Procedure reference) | 313 | (Memory statistics in the .stat file) |
1370 | 314 | endobj | 314 | endobj |
1371 | 315 | 209 0 obj | 315 | 209 0 obj |
1373 | 316 | << /S /GoTo /D (chapter.11) >> | 316 | << /S /GoTo /D (part.3) >> |
1374 | 317 | endobj | 317 | endobj |
1375 | 318 | 212 0 obj | 318 | 212 0 obj |
1377 | 319 | (General principles for procedures) | 319 | (III Procedure reference) |
1378 | 320 | endobj | 320 | endobj |
1379 | 321 | 213 0 obj | 321 | 213 0 obj |
1381 | 322 | << /S /GoTo /D (section.11.1) >> | 322 | << /S /GoTo /D (chapter.11) >> |
1382 | 323 | endobj | 323 | endobj |
1383 | 324 | 216 0 obj | 324 | 216 0 obj |
1385 | 325 | (Field, mesh and matrix interfaces) | 325 | (General principles for procedures) |
1386 | 326 | endobj | 326 | endobj |
1387 | 327 | 217 0 obj | 327 | 217 0 obj |
1389 | 328 | << /S /GoTo /D (section.11.2) >> | 328 | << /S /GoTo /D (section.11.1) >> |
1390 | 329 | endobj | 329 | endobj |
1391 | 330 | 220 0 obj | 330 | 220 0 obj |
1393 | 331 | (Status arguments) | 331 | (Field, mesh and matrix interfaces) |
1394 | 332 | endobj | 332 | endobj |
1395 | 333 | 221 0 obj | 333 | 221 0 obj |
1397 | 334 | << /S /GoTo /D (chapter.12) >> | 334 | << /S /GoTo /D (section.11.2) >> |
1398 | 335 | endobj | 335 | endobj |
1399 | 336 | 224 0 obj | 336 | 224 0 obj |
1401 | 337 | (Field and mesh methods) | 337 | (Status arguments) |
1402 | 338 | endobj | 338 | endobj |
1403 | 339 | 225 0 obj | 339 | 225 0 obj |
1405 | 340 | << /S /GoTo /D (section.12.1) >> | 340 | << /S /GoTo /D (chapter.12) >> |
1406 | 341 | endobj | 341 | endobj |
1407 | 342 | 228 0 obj | 342 | 228 0 obj |
1409 | 343 | (Global field and mesh enquiry routines) | 343 | (Field and mesh methods) |
1410 | 344 | endobj | 344 | endobj |
1411 | 345 | 229 0 obj | 345 | 229 0 obj |
1413 | 346 | << /S /GoTo /D (subsection.12.1.1) >> | 346 | << /S /GoTo /D (section.12.1) >> |
1414 | 347 | endobj | 347 | endobj |
1415 | 348 | 232 0 obj | 348 | 232 0 obj |
1417 | 349 | (mesh\137dim) | 349 | (Global field and mesh enquiry routines) |
1418 | 350 | endobj | 350 | endobj |
1419 | 351 | 233 0 obj | 351 | 233 0 obj |
1421 | 352 | << /S /GoTo /D (subsection.12.1.2) >> | 352 | << /S /GoTo /D (subsection.12.1.1) >> |
1422 | 353 | endobj | 353 | endobj |
1423 | 354 | 236 0 obj | 354 | 236 0 obj |
1425 | 355 | (mesh\137periodic) | 355 | (mesh\137dim) |
1426 | 356 | endobj | 356 | endobj |
1427 | 357 | 237 0 obj | 357 | 237 0 obj |
1429 | 358 | << /S /GoTo /D (subsection.12.1.3) >> | 358 | << /S /GoTo /D (subsection.12.1.2) >> |
1430 | 359 | endobj | 359 | endobj |
1431 | 360 | 240 0 obj | 360 | 240 0 obj |
1433 | 361 | (node\137count) | 361 | (mesh\137periodic) |
1434 | 362 | endobj | 362 | endobj |
1435 | 363 | 241 0 obj | 363 | 241 0 obj |
1437 | 364 | << /S /GoTo /D (subsection.12.1.4) >> | 364 | << /S /GoTo /D (subsection.12.1.3) >> |
1438 | 365 | endobj | 365 | endobj |
1439 | 366 | 244 0 obj | 366 | 244 0 obj |
1441 | 367 | (element\137count) | 367 | (node\137count) |
1442 | 368 | endobj | 368 | endobj |
1443 | 369 | 245 0 obj | 369 | 245 0 obj |
1445 | 370 | << /S /GoTo /D (subsection.12.1.5) >> | 370 | << /S /GoTo /D (subsection.12.1.4) >> |
1446 | 371 | endobj | 371 | endobj |
1447 | 372 | 248 0 obj | 372 | 248 0 obj |
1449 | 373 | (surface\137element\137count) | 373 | (element\137count) |
1450 | 374 | endobj | 374 | endobj |
1451 | 375 | 249 0 obj | 375 | 249 0 obj |
1453 | 376 | << /S /GoTo /D (subsection.12.1.6) >> | 376 | << /S /GoTo /D (subsection.12.1.5) >> |
1454 | 377 | endobj | 377 | endobj |
1455 | 378 | 252 0 obj | 378 | 252 0 obj |
1457 | 379 | (face\137count) | 379 | (surface\137element\137count) |
1458 | 380 | endobj | 380 | endobj |
1459 | 381 | 253 0 obj | 381 | 253 0 obj |
1461 | 382 | << /S /GoTo /D (subsection.12.1.7) >> | 382 | << /S /GoTo /D (subsection.12.1.6) >> |
1462 | 383 | endobj | 383 | endobj |
1463 | 384 | 256 0 obj | 384 | 256 0 obj |
1465 | 385 | (aliased) | 385 | (face\137count) |
1466 | 386 | endobj | 386 | endobj |
1467 | 387 | 257 0 obj | 387 | 257 0 obj |
1469 | 388 | << /S /GoTo /D (section.12.2) >> | 388 | << /S /GoTo /D (subsection.12.1.7) >> |
1470 | 389 | endobj | 389 | endobj |
1471 | 390 | 260 0 obj | 390 | 260 0 obj |
1473 | 391 | (Element enquiry routines) | 391 | (aliased) |
1474 | 392 | endobj | 392 | endobj |
1475 | 393 | 261 0 obj | 393 | 261 0 obj |
1477 | 394 | << /S /GoTo /D (subsection.12.2.1) >> | 394 | << /S /GoTo /D (section.12.2) >> |
1478 | 395 | endobj | 395 | endobj |
1479 | 396 | 264 0 obj | 396 | 264 0 obj |
1481 | 397 | (ele\137loc) | 397 | (Element enquiry routines) |
1482 | 398 | endobj | 398 | endobj |
1483 | 399 | 265 0 obj | 399 | 265 0 obj |
1485 | 400 | << /S /GoTo /D (subsection.12.2.2) >> | 400 | << /S /GoTo /D (subsection.12.2.1) >> |
1486 | 401 | endobj | 401 | endobj |
1487 | 402 | 268 0 obj | 402 | 268 0 obj |
1489 | 403 | (ele\137and\137faces\137loc) | 403 | (ele\137loc) |
1490 | 404 | endobj | 404 | endobj |
1491 | 405 | 269 0 obj | 405 | 269 0 obj |
1493 | 406 | << /S /GoTo /D (subsection.12.2.3) >> | 406 | << /S /GoTo /D (subsection.12.2.2) >> |
1494 | 407 | endobj | 407 | endobj |
1495 | 408 | 272 0 obj | 408 | 272 0 obj |
1497 | 409 | (ele\137vertices) | 409 | (ele\137and\137faces\137loc) |
1498 | 410 | endobj | 410 | endobj |
1499 | 411 | 273 0 obj | 411 | 273 0 obj |
1501 | 412 | << /S /GoTo /D (subsection.12.2.4) >> | 412 | << /S /GoTo /D (subsection.12.2.3) >> |
1502 | 413 | endobj | 413 | endobj |
1503 | 414 | 276 0 obj | 414 | 276 0 obj |
1505 | 415 | (ele\137ngi) | 415 | (ele\137vertices) |
1506 | 416 | endobj | 416 | endobj |
1507 | 417 | 277 0 obj | 417 | 277 0 obj |
1509 | 418 | << /S /GoTo /D (subsection.12.2.5) >> | 418 | << /S /GoTo /D (subsection.12.2.4) >> |
1510 | 419 | endobj | 419 | endobj |
1511 | 420 | 280 0 obj | 420 | 280 0 obj |
1513 | 421 | (ele\137nodes) | 421 | (ele\137ngi) |
1514 | 422 | endobj | 422 | endobj |
1515 | 423 | 281 0 obj | 423 | 281 0 obj |
1517 | 424 | << /S /GoTo /D (section.12.3) >> | 424 | << /S /GoTo /D (subsection.12.2.5) >> |
1518 | 425 | endobj | 425 | endobj |
1519 | 426 | 284 0 obj | 426 | 284 0 obj |
1521 | 427 | (Face enquiry routines) | 427 | (ele\137nodes) |
1522 | 428 | endobj | 428 | endobj |
1523 | 429 | 285 0 obj | 429 | 285 0 obj |
1525 | 430 | << /S /GoTo /D (subsection.12.3.1) >> | 430 | << /S /GoTo /D (section.12.3) >> |
1526 | 431 | endobj | 431 | endobj |
1527 | 432 | 288 0 obj | 432 | 288 0 obj |
1529 | 433 | (face\137loc) | 433 | (Face enquiry routines) |
1530 | 434 | endobj | 434 | endobj |
1531 | 435 | 289 0 obj | 435 | 289 0 obj |
1533 | 436 | << /S /GoTo /D (subsection.12.3.2) >> | 436 | << /S /GoTo /D (subsection.12.3.1) >> |
1534 | 437 | endobj | 437 | endobj |
1535 | 438 | 292 0 obj | 438 | 292 0 obj |
1537 | 439 | (face\137vertices) | 439 | (face\137loc) |
1538 | 440 | endobj | 440 | endobj |
1539 | 441 | 293 0 obj | 441 | 293 0 obj |
1541 | 442 | << /S /GoTo /D (subsection.12.3.3) >> | 442 | << /S /GoTo /D (subsection.12.3.2) >> |
1542 | 443 | endobj | 443 | endobj |
1543 | 444 | 296 0 obj | 444 | 296 0 obj |
1545 | 445 | (face\137ngi) | 445 | (face\137vertices) |
1546 | 446 | endobj | 446 | endobj |
1547 | 447 | 297 0 obj | 447 | 297 0 obj |
1549 | 448 | << /S /GoTo /D (subsection.12.3.4) >> | 448 | << /S /GoTo /D (subsection.12.3.3) >> |
1550 | 449 | endobj | 449 | endobj |
1551 | 450 | 300 0 obj | 450 | 300 0 obj |
1553 | 451 | (face\137local\137nodes) | 451 | (face\137ngi) |
1554 | 452 | endobj | 452 | endobj |
1555 | 453 | 301 0 obj | 453 | 301 0 obj |
1557 | 454 | << /S /GoTo /D (subsection.12.3.5) >> | 454 | << /S /GoTo /D (subsection.12.3.4) >> |
1558 | 455 | endobj | 455 | endobj |
1559 | 456 | 304 0 obj | 456 | 304 0 obj |
1561 | 457 | (face\137global\137nodes) | 457 | (face\137local\137nodes) |
1562 | 458 | endobj | 458 | endobj |
1563 | 459 | 305 0 obj | 459 | 305 0 obj |
1565 | 460 | << /S /GoTo /D (section.12.4) >> | 460 | << /S /GoTo /D (subsection.12.3.5) >> |
1566 | 461 | endobj | 461 | endobj |
1567 | 462 | 308 0 obj | 462 | 308 0 obj |
1569 | 463 | (Data retrieval routines) | 463 | (face\137global\137nodes) |
1570 | 464 | endobj | 464 | endobj |
1571 | 465 | 309 0 obj | 465 | 309 0 obj |
1573 | 466 | << /S /GoTo /D (subsection.12.4.1) >> | 466 | << /S /GoTo /D (section.12.4) >> |
1574 | 467 | endobj | 467 | endobj |
1575 | 468 | 312 0 obj | 468 | 312 0 obj |
1577 | 469 | (ele\137val) | 469 | (Data retrieval routines) |
1578 | 470 | endobj | 470 | endobj |
1579 | 471 | 313 0 obj | 471 | 313 0 obj |
1581 | 472 | << /S /GoTo /D (subsection.12.4.2) >> | 472 | << /S /GoTo /D (subsection.12.4.1) >> |
1582 | 473 | endobj | 473 | endobj |
1583 | 474 | 316 0 obj | 474 | 316 0 obj |
1585 | 475 | (ele\137val\137at\137quad) | 475 | (ele\137val) |
1586 | 476 | endobj | 476 | endobj |
1587 | 477 | 317 0 obj | 477 | 317 0 obj |
1589 | 478 | << /S /GoTo /D (subsection.12.4.3) >> | 478 | << /S /GoTo /D (subsection.12.4.2) >> |
1590 | 479 | endobj | 479 | endobj |
1591 | 480 | 320 0 obj | 480 | 320 0 obj |
1593 | 481 | (face\137val) | 481 | (ele\137val\137at\137quad) |
1594 | 482 | endobj | 482 | endobj |
1595 | 483 | 321 0 obj | 483 | 321 0 obj |
1597 | 484 | << /S /GoTo /D (subsection.12.4.4) >> | 484 | << /S /GoTo /D (subsection.12.4.3) >> |
1598 | 485 | endobj | 485 | endobj |
1599 | 486 | 324 0 obj | 486 | 324 0 obj |
1601 | 487 | (node\137val) | 487 | (face\137val) |
1602 | 488 | endobj | 488 | endobj |
1603 | 489 | 325 0 obj | 489 | 325 0 obj |
1605 | 490 | << /S /GoTo /D (section.12.5) >> | 490 | << /S /GoTo /D (subsection.12.4.4) >> |
1606 | 491 | endobj | 491 | endobj |
1607 | 492 | 328 0 obj | 492 | 328 0 obj |
1609 | 493 | (Data setting routines) | 493 | (node\137val) |
1610 | 494 | endobj | 494 | endobj |
1611 | 495 | 329 0 obj | 495 | 329 0 obj |
1613 | 496 | << /S /GoTo /D (subsection.12.5.1) >> | 496 | << /S /GoTo /D (section.12.5) >> |
1614 | 497 | endobj | 497 | endobj |
1615 | 498 | 332 0 obj | 498 | 332 0 obj |
1617 | 499 | (addto) | 499 | (Data setting routines) |
1618 | 500 | endobj | 500 | endobj |
1619 | 501 | 333 0 obj | 501 | 333 0 obj |
1621 | 502 | << /S /GoTo /D (subsection.12.5.2) >> | 502 | << /S /GoTo /D (subsection.12.5.1) >> |
1622 | 503 | endobj | 503 | endobj |
1623 | 504 | 336 0 obj | 504 | 336 0 obj |
1625 | 505 | (scale) | 505 | (addto) |
1626 | 506 | endobj | 506 | endobj |
1627 | 507 | 337 0 obj | 507 | 337 0 obj |
1629 | 508 | << /S /GoTo /D (subsection.12.5.3) >> | 508 | << /S /GoTo /D (subsection.12.5.2) >> |
1630 | 509 | endobj | 509 | endobj |
1631 | 510 | 340 0 obj | 510 | 340 0 obj |
1633 | 511 | (set) | 511 | (scale) |
1634 | 512 | endobj | 512 | endobj |
1635 | 513 | 341 0 obj | 513 | 341 0 obj |
1637 | 514 | << /S /GoTo /D (subsection.12.5.4) >> | 514 | << /S /GoTo /D (subsection.12.5.3) >> |
1638 | 515 | endobj | 515 | endobj |
1639 | 516 | 344 0 obj | 516 | 344 0 obj |
1641 | 517 | (zero) | 517 | (set) |
1642 | 518 | endobj | 518 | endobj |
1643 | 519 | 345 0 obj | 519 | 345 0 obj |
1645 | 520 | << /S /GoTo /D (chapter.13) >> | 520 | << /S /GoTo /D (subsection.12.5.4) >> |
1646 | 521 | endobj | 521 | endobj |
1647 | 522 | 348 0 obj | 522 | 348 0 obj |
1649 | 523 | (State dictionary methods) | 523 | (zero) |
1650 | 524 | endobj | 524 | endobj |
1651 | 525 | 349 0 obj | 525 | 349 0 obj |
1653 | 526 | << /S /GoTo /D (section.13.1) >> | 526 | << /S /GoTo /D (chapter.13) >> |
1654 | 527 | endobj | 527 | endobj |
1655 | 528 | 352 0 obj | 528 | 352 0 obj |
1657 | 529 | (Inserting objects in states) | 529 | (State dictionary methods) |
1658 | 530 | endobj | 530 | endobj |
1659 | 531 | 353 0 obj | 531 | 353 0 obj |
1661 | 532 | << /S /GoTo /D (subsection.13.1.1) >> | 532 | << /S /GoTo /D (section.13.1) >> |
1662 | 533 | endobj | 533 | endobj |
1663 | 534 | 356 0 obj | 534 | 356 0 obj |
1665 | 535 | (insert) | 535 | (Inserting objects in states) |
1666 | 536 | endobj | 536 | endobj |
1667 | 537 | 357 0 obj | 537 | 357 0 obj |
1669 | 538 | << /S /GoTo /D (section.13.2) >> | 538 | << /S /GoTo /D (subsection.13.1.1) >> |
1670 | 539 | endobj | 539 | endobj |
1671 | 540 | 360 0 obj | 540 | 360 0 obj |
1673 | 541 | (Extracting objects from states) | 541 | (insert) |
1674 | 542 | endobj | 542 | endobj |
1675 | 543 | 361 0 obj | 543 | 361 0 obj |
1677 | 544 | << /S /GoTo /D (subsection.13.2.1) >> | 544 | << /S /GoTo /D (section.13.2) >> |
1678 | 545 | endobj | 545 | endobj |
1679 | 546 | 364 0 obj | 546 | 364 0 obj |
1681 | 547 | (Extracting objects by name) | 547 | (Extracting objects from states) |
1682 | 548 | endobj | 548 | endobj |
1683 | 549 | 365 0 obj | 549 | 365 0 obj |
1685 | 550 | << /S /GoTo /D (subsection.13.2.2) >> | 550 | << /S /GoTo /D (subsection.13.2.1) >> |
1686 | 551 | endobj | 551 | endobj |
1687 | 552 | 368 0 obj | 552 | 368 0 obj |
1689 | 553 | (Extracting objects by index) | 553 | (Extracting objects by name) |
1690 | 554 | endobj | 554 | endobj |
1691 | 555 | 369 0 obj | 555 | 369 0 obj |
1693 | 556 | << /S /GoTo /D (section.13.3) >> | 556 | << /S /GoTo /D (subsection.13.2.2) >> |
1694 | 557 | endobj | 557 | endobj |
1695 | 558 | 372 0 obj | 558 | 372 0 obj |
1697 | 559 | (Auxiliary state routines) | 559 | (Extracting objects by index) |
1698 | 560 | endobj | 560 | endobj |
1699 | 561 | 373 0 obj | 561 | 373 0 obj |
1701 | 562 | << /S /GoTo /D (subsection.13.3.1) >> | 562 | << /S /GoTo /D (section.13.3) >> |
1702 | 563 | endobj | 563 | endobj |
1703 | 564 | 376 0 obj | 564 | 376 0 obj |
1705 | 565 | (deallocate) | 565 | (Auxiliary state routines) |
1706 | 566 | endobj | 566 | endobj |
1707 | 567 | 377 0 obj | 567 | 377 0 obj |
1709 | 568 | << /S /GoTo /D (subsection.13.3.2) >> | 568 | << /S /GoTo /D (subsection.13.3.1) >> |
1710 | 569 | endobj | 569 | endobj |
1711 | 570 | 380 0 obj | 570 | 380 0 obj |
1713 | 571 | (remove object) | 571 | (deallocate) |
1714 | 572 | endobj | 572 | endobj |
1715 | 573 | 381 0 obj | 573 | 381 0 obj |
1717 | 574 | << /S /GoTo /D (subsection.13.3.3) >> | 574 | << /S /GoTo /D (subsection.13.3.2) >> |
1718 | 575 | endobj | 575 | endobj |
1719 | 576 | 384 0 obj | 576 | 384 0 obj |
1721 | 577 | (object counts) | 577 | (remove object) |
1722 | 578 | endobj | 578 | endobj |
1723 | 579 | 385 0 obj | 579 | 385 0 obj |
1725 | 580 | << /S /GoTo /D (chapter.14) >> | 580 | << /S /GoTo /D (subsection.13.3.3) >> |
1726 | 581 | endobj | 581 | endobj |
1727 | 582 | 388 0 obj | 582 | 388 0 obj |
1729 | 583 | (Element methods) | 583 | (object counts) |
1730 | 584 | endobj | 584 | endobj |
1731 | 585 | 389 0 obj | 585 | 389 0 obj |
1733 | 586 | << /S /GoTo /D (section.14.1) >> | 586 | << /S /GoTo /D (chapter.14) >> |
1734 | 587 | endobj | 587 | endobj |
1735 | 588 | 392 0 obj | 588 | 392 0 obj |
1737 | 589 | (Quadrature methods) | 589 | (Element methods) |
1738 | 590 | endobj | 590 | endobj |
1739 | 591 | 393 0 obj | 591 | 393 0 obj |
1741 | 592 | << /S /GoTo /D (subsection.14.1.1) >> | 592 | << /S /GoTo /D (section.14.1) >> |
1742 | 593 | endobj | 593 | endobj |
1743 | 594 | 396 0 obj | 594 | 396 0 obj |
1745 | 595 | (make\137quadrature) | 595 | (Quadrature methods) |
1746 | 596 | endobj | 596 | endobj |
1747 | 597 | 397 0 obj | 597 | 397 0 obj |
1749 | 598 | << /S /GoTo /D (subsection.14.1.2) >> | 598 | << /S /GoTo /D (subsection.14.1.1) >> |
1750 | 599 | endobj | 599 | endobj |
1751 | 600 | 400 0 obj | 600 | 400 0 obj |
1753 | 601 | (deallocate) | 601 | (make\137quadrature) |
1754 | 602 | endobj | 602 | endobj |
1755 | 603 | 401 0 obj | 603 | 401 0 obj |
1757 | 604 | << /S /GoTo /D (section.14.2) >> | 604 | << /S /GoTo /D (subsection.14.1.2) >> |
1758 | 605 | endobj | 605 | endobj |
1759 | 606 | 404 0 obj | 606 | 404 0 obj |
1761 | 607 | (Shape function methods) | 607 | (deallocate) |
1762 | 608 | endobj | 608 | endobj |
1763 | 609 | 405 0 obj | 609 | 405 0 obj |
1765 | 610 | << /S /GoTo /D (subsection.14.2.1) >> | 610 | << /S /GoTo /D (section.14.2) >> |
1766 | 611 | endobj | 611 | endobj |
1767 | 612 | 408 0 obj | 612 | 408 0 obj |
1769 | 613 | (make\137element\137shape) | 613 | (Shape function methods) |
1770 | 614 | endobj | 614 | endobj |
1771 | 615 | 409 0 obj | 615 | 409 0 obj |
1773 | 616 | << /S /GoTo /D (subsection.14.2.2) >> | 616 | << /S /GoTo /D (subsection.14.2.1) >> |
1774 | 617 | endobj | 617 | endobj |
1775 | 618 | 412 0 obj | 618 | 412 0 obj |
1777 | 619 | (deallocate) | 619 | (make\137element\137shape) |
1778 | 620 | endobj | 620 | endobj |
1779 | 621 | 413 0 obj | 621 | 413 0 obj |
1780 | 622 | << /S /GoTo /D (subsection.14.2.2) >> | ||
1781 | 623 | endobj | ||
1782 | 624 | 416 0 obj | ||
1783 | 625 | (deallocate) | ||
1784 | 626 | endobj | ||
1785 | 627 | 417 0 obj | ||
1786 | 622 | << /S /GoTo /D (subsection.14.2.3) >> | 628 | << /S /GoTo /D (subsection.14.2.3) >> |
1787 | 623 | endobj | 629 | endobj |
1789 | 624 | 416 0 obj | 630 | 420 0 obj |
1790 | 625 | (local\137coords) | 631 | (local\137coords) |
1791 | 626 | endobj | 632 | endobj |
1793 | 627 | 417 0 obj | 633 | 421 0 obj |
1794 | 628 | << /S /GoTo /D (subsection.14.2.4) >> | 634 | << /S /GoTo /D (subsection.14.2.4) >> |
1795 | 629 | endobj | 635 | endobj |
1797 | 630 | 420 0 obj | 636 | 424 0 obj |
1798 | 631 | (local\137coord\137count) | 637 | (local\137coord\137count) |
1799 | 632 | endobj | 638 | endobj |
1801 | 633 | 421 0 obj | 639 | 425 0 obj |
1802 | 634 | << /S /GoTo /D (subsection.14.2.5) >> | 640 | << /S /GoTo /D (subsection.14.2.5) >> |
1803 | 635 | endobj | 641 | endobj |
1805 | 636 | 424 0 obj | 642 | 428 0 obj |
1806 | 637 | (eval\137shape) | 643 | (eval\137shape) |
1807 | 638 | endobj | 644 | endobj |
1809 | 639 | 425 0 obj | 645 | 429 0 obj |
1810 | 640 | << /S /GoTo /D (chapter.15) >> | 646 | << /S /GoTo /D (chapter.15) >> |
1811 | 641 | endobj | 647 | endobj |
1813 | 642 | 428 0 obj | 648 | 432 0 obj |
1814 | 643 | (Functions implementing integrals over elements) | 649 | (Functions implementing integrals over elements) |
1815 | 644 | endobj | 650 | endobj |
1817 | 645 | 429 0 obj | 651 | 433 0 obj |
1818 | 646 | << /S /GoTo /D (section.15.1) >> | 652 | << /S /GoTo /D (section.15.1) >> |
1819 | 647 | endobj | 653 | endobj |
1821 | 648 | 432 0 obj | 654 | 436 0 obj |
1822 | 649 | (Bilinear forms) | 655 | (Bilinear forms) |
1823 | 650 | endobj | 656 | endobj |
1825 | 651 | 433 0 obj | 657 | 437 0 obj |
1826 | 652 | << /S /GoTo /D (subsection.15.1.1) >> | 658 | << /S /GoTo /D (subsection.15.1.1) >> |
1827 | 653 | endobj | 659 | endobj |
1829 | 654 | 436 0 obj | 660 | 440 0 obj |
1830 | 655 | (shape\137shape) | 661 | (shape\137shape) |
1831 | 656 | endobj | 662 | endobj |
1833 | 657 | 437 0 obj | 663 | 441 0 obj |
1834 | 658 | << /S /GoTo /D (subsection.15.1.2) >> | 664 | << /S /GoTo /D (subsection.15.1.2) >> |
1835 | 659 | endobj | 665 | endobj |
1837 | 660 | 440 0 obj | 666 | 444 0 obj |
1838 | 661 | (shape\137shape\137vector) | 667 | (shape\137shape\137vector) |
1839 | 662 | endobj | 668 | endobj |
1841 | 663 | 441 0 obj | 669 | 445 0 obj |
1842 | 664 | << /S /GoTo /D (subsection.15.1.3) >> | 670 | << /S /GoTo /D (subsection.15.1.3) >> |
1843 | 665 | endobj | 671 | endobj |
1845 | 666 | 444 0 obj | 672 | 448 0 obj |
1846 | 667 | (shape\137shape\137tensor) | 673 | (shape\137shape\137tensor) |
1847 | 668 | endobj | 674 | endobj |
1849 | 669 | 445 0 obj | 675 | 449 0 obj |
1850 | 670 | << /S /GoTo /D (subsection.15.1.4) >> | 676 | << /S /GoTo /D (subsection.15.1.4) >> |
1851 | 671 | endobj | 677 | endobj |
1853 | 672 | 448 0 obj | 678 | 452 0 obj |
1854 | 673 | (shape\137shape\137vector\137outer\137vector) | 679 | (shape\137shape\137vector\137outer\137vector) |
1855 | 674 | endobj | 680 | endobj |
1857 | 675 | 449 0 obj | 681 | 453 0 obj |
1858 | 676 | << /S /GoTo /D (subsection.15.1.5) >> | 682 | << /S /GoTo /D (subsection.15.1.5) >> |
1859 | 677 | endobj | 683 | endobj |
1861 | 678 | 452 0 obj | 684 | 456 0 obj |
1862 | 679 | (shape\137dshape) | 685 | (shape\137dshape) |
1863 | 680 | endobj | 686 | endobj |
1865 | 681 | 453 0 obj | 687 | 457 0 obj |
1866 | 682 | << /S /GoTo /D (subsection.15.1.6) >> | 688 | << /S /GoTo /D (subsection.15.1.6) >> |
1867 | 683 | endobj | 689 | endobj |
1869 | 684 | 456 0 obj | 690 | 460 0 obj |
1870 | 685 | (dshape\137shape) | 691 | (dshape\137shape) |
1871 | 686 | endobj | 692 | endobj |
1873 | 687 | 457 0 obj | 693 | 461 0 obj |
1874 | 688 | << /S /GoTo /D (subsection.15.1.7) >> | 694 | << /S /GoTo /D (subsection.15.1.7) >> |
1875 | 689 | endobj | 695 | endobj |
1877 | 690 | 460 0 obj | 696 | 464 0 obj |
1878 | 691 | (shape\137vector\137dot\137dshape) | 697 | (shape\137vector\137dot\137dshape) |
1879 | 692 | endobj | 698 | endobj |
1881 | 693 | 461 0 obj | 699 | 465 0 obj |
1882 | 694 | << /S /GoTo /D (subsection.15.1.8) >> | 700 | << /S /GoTo /D (subsection.15.1.8) >> |
1883 | 695 | endobj | 701 | endobj |
1885 | 696 | 464 0 obj | 702 | 468 0 obj |
1886 | 697 | (dshape\137dot\137vector\137shape) | 703 | (dshape\137dot\137vector\137shape) |
1887 | 698 | endobj | 704 | endobj |
1889 | 699 | 465 0 obj | 705 | 469 0 obj |
1890 | 700 | << /S /GoTo /D (subsection.15.1.9) >> | 706 | << /S /GoTo /D (subsection.15.1.9) >> |
1891 | 701 | endobj | 707 | endobj |
1893 | 702 | 468 0 obj | 708 | 472 0 obj |
1894 | 703 | (dshape\137dot\137tensor\137shape) | 709 | (dshape\137dot\137tensor\137shape) |
1895 | 704 | endobj | 710 | endobj |
1897 | 705 | 469 0 obj | 711 | 473 0 obj |
1898 | 706 | << /S /GoTo /D (subsection.15.1.10) >> | 712 | << /S /GoTo /D (subsection.15.1.10) >> |
1899 | 707 | endobj | 713 | endobj |
1901 | 708 | 472 0 obj | 714 | 476 0 obj |
1902 | 709 | (shape\137vector\137outer\137dshape) | 715 | (shape\137vector\137outer\137dshape) |
1903 | 710 | endobj | 716 | endobj |
1905 | 711 | 473 0 obj | 717 | 477 0 obj |
1906 | 712 | << /S /GoTo /D (subsection.15.1.11) >> | 718 | << /S /GoTo /D (subsection.15.1.11) >> |
1907 | 713 | endobj | 719 | endobj |
1909 | 714 | 476 0 obj | 720 | 480 0 obj |
1910 | 715 | (dshape\137outer\137vector\137shape) | 721 | (dshape\137outer\137vector\137shape) |
1911 | 716 | endobj | 722 | endobj |
1913 | 717 | 477 0 obj | 723 | 481 0 obj |
1914 | 718 | << /S /GoTo /D (subsection.15.1.12) >> | 724 | << /S /GoTo /D (subsection.15.1.12) >> |
1915 | 719 | endobj | 725 | endobj |
1917 | 720 | 480 0 obj | 726 | 484 0 obj |
1918 | 721 | (dshape\137dot\137dshape) | 727 | (dshape\137dot\137dshape) |
1919 | 722 | endobj | 728 | endobj |
1921 | 723 | 481 0 obj | 729 | 485 0 obj |
1922 | 724 | << /S /GoTo /D (subsection.15.1.13) >> | 730 | << /S /GoTo /D (subsection.15.1.13) >> |
1923 | 725 | endobj | 731 | endobj |
1925 | 726 | 484 0 obj | 732 | 488 0 obj |
1926 | 727 | (dshape\137tensor\137dshape) | 733 | (dshape\137tensor\137dshape) |
1927 | 728 | endobj | 734 | endobj |
1929 | 729 | 485 0 obj | 735 | 489 0 obj |
1930 | 730 | << /S /GoTo /D (subsection.15.1.14) >> | 736 | << /S /GoTo /D (subsection.15.1.14) >> |
1931 | 731 | endobj | 737 | endobj |
1933 | 732 | 488 0 obj | 738 | 492 0 obj |
1934 | 733 | (dshape\137outer\137dshape) | 739 | (dshape\137outer\137dshape) |
1935 | 734 | endobj | 740 | endobj |
1937 | 735 | 489 0 obj | 741 | 493 0 obj |
1938 | 736 | << /S /GoTo /D (subsection.15.1.15) >> | 742 | << /S /GoTo /D (subsection.15.1.15) >> |
1939 | 737 | endobj | 743 | endobj |
1941 | 738 | 492 0 obj | 744 | 496 0 obj |
1942 | 739 | (shape\137curl\137shape\1372d) | 745 | (shape\137curl\137shape\1372d) |
1943 | 740 | endobj | 746 | endobj |
1945 | 741 | 493 0 obj | 747 | 497 0 obj |
1946 | 742 | << /S /GoTo /D (section.15.2) >> | 748 | << /S /GoTo /D (section.15.2) >> |
1947 | 743 | endobj | 749 | endobj |
1949 | 744 | 496 0 obj | 750 | 500 0 obj |
1950 | 745 | (Linear Forms) | 751 | (Linear Forms) |
1951 | 746 | endobj | 752 | endobj |
1953 | 747 | 497 0 obj | 753 | 501 0 obj |
1954 | 748 | << /S /GoTo /D (subsection.15.2.1) >> | 754 | << /S /GoTo /D (subsection.15.2.1) >> |
1955 | 749 | endobj | 755 | endobj |
1957 | 750 | 500 0 obj | 756 | 504 0 obj |
1958 | 751 | (shape\137rhs) | 757 | (shape\137rhs) |
1959 | 752 | endobj | 758 | endobj |
1961 | 753 | 501 0 obj | 759 | 505 0 obj |
1962 | 754 | << /S /GoTo /D (subsection.15.2.2) >> | 760 | << /S /GoTo /D (subsection.15.2.2) >> |
1963 | 755 | endobj | 761 | endobj |
1965 | 756 | 504 0 obj | 762 | 508 0 obj |
1966 | 757 | (shape\137vector\137rhs) | 763 | (shape\137vector\137rhs) |
1967 | 758 | endobj | 764 | endobj |
1969 | 759 | 505 0 obj | 765 | 509 0 obj |
1970 | 760 | << /S /GoTo /D (subsection.15.2.3) >> | 766 | << /S /GoTo /D (subsection.15.2.3) >> |
1971 | 761 | endobj | 767 | endobj |
1973 | 762 | 508 0 obj | 768 | 512 0 obj |
1974 | 763 | (shape\137tensor\137rhs) | 769 | (shape\137tensor\137rhs) |
1975 | 764 | endobj | 770 | endobj |
1977 | 765 | 509 0 obj | 771 | 513 0 obj |
1978 | 766 | << /S /GoTo /D (subsection.15.2.4) >> | 772 | << /S /GoTo /D (subsection.15.2.4) >> |
1979 | 767 | endobj | 773 | endobj |
1981 | 768 | 512 0 obj | 774 | 516 0 obj |
1982 | 769 | (shape\137tensor\137dot\137vector\137rhs) | 775 | (shape\137tensor\137dot\137vector\137rhs) |
1983 | 770 | endobj | 776 | endobj |
1985 | 771 | 513 0 obj | 777 | 517 0 obj |
1986 | 772 | << /S /GoTo /D (subsection.15.2.5) >> | 778 | << /S /GoTo /D (subsection.15.2.5) >> |
1987 | 773 | endobj | 779 | endobj |
1989 | 774 | 516 0 obj | 780 | 520 0 obj |
1990 | 775 | (dshape\137rhs) | 781 | (dshape\137rhs) |
1991 | 776 | endobj | 782 | endobj |
1993 | 777 | 517 0 obj | 783 | 521 0 obj |
1994 | 778 | << /S /GoTo /D (subsection.15.2.6) >> | 784 | << /S /GoTo /D (subsection.15.2.6) >> |
1995 | 779 | endobj | 785 | endobj |
1997 | 780 | 520 0 obj | 786 | 524 0 obj |
1998 | 781 | (dshape\137dot\137vector\137rhs) | 787 | (dshape\137dot\137vector\137rhs) |
1999 | 782 | endobj | 788 | endobj |
2001 | 783 | 521 0 obj | 789 | 525 0 obj |
2002 | 784 | << /S /GoTo /D (subsection.15.2.7) >> | 790 | << /S /GoTo /D (subsection.15.2.7) >> |
2003 | 785 | endobj | 791 | endobj |
2005 | 786 | 524 0 obj | 792 | 528 0 obj |
2006 | 787 | (dshape\137dot\137tensor\137rhs) | 793 | (dshape\137dot\137tensor\137rhs) |
2007 | 788 | endobj | 794 | endobj |
2009 | 789 | 525 0 obj | 795 | 529 0 obj |
2010 | 790 | << /S /GoTo /D (section.15.3) >> | 796 | << /S /GoTo /D (section.15.3) >> |
2011 | 791 | endobj | 797 | endobj |
2013 | 792 | 528 0 obj | 798 | 532 0 obj |
2014 | 793 | (Auxiliary form functions) | 799 | (Auxiliary form functions) |
2015 | 794 | endobj | 800 | endobj |
2017 | 795 | 529 0 obj | 801 | 533 0 obj |
2018 | 796 | << /S /GoTo /D (subsection.15.3.1) >> | 802 | << /S /GoTo /D (subsection.15.3.1) >> |
2019 | 797 | endobj | 803 | endobj |
2021 | 798 | 532 0 obj | 804 | 536 0 obj |
2022 | 799 | (dshape\137loc) | 805 | (dshape\137loc) |
2023 | 800 | endobj | 806 | endobj |
2025 | 801 | 533 0 obj | 807 | 537 0 obj |
2026 | 802 | << /S /GoTo /D (subsection.15.3.2) >> | 808 | << /S /GoTo /D (subsection.15.3.2) >> |
2027 | 803 | endobj | 809 | endobj |
2029 | 804 | 536 0 obj | 810 | 540 0 obj |
2030 | 805 | (dshape\137ngi) | 811 | (dshape\137ngi) |
2031 | 806 | endobj | 812 | endobj |
2033 | 807 | 537 0 obj | 813 | 541 0 obj |
2034 | 808 | << /S /GoTo /D (subsection.15.3.3) >> | 814 | << /S /GoTo /D (subsection.15.3.3) >> |
2035 | 809 | endobj | 815 | endobj |
2037 | 810 | 540 0 obj | 816 | 544 0 obj |
2038 | 811 | (dshape\137dim) | 817 | (dshape\137dim) |
2039 | 812 | endobj | 818 | endobj |
2041 | 813 | 541 0 obj | 819 | 545 0 obj |
2042 | 814 | << /S /GoTo /D (subsection.15.3.4) >> | 820 | << /S /GoTo /D (subsection.15.3.4) >> |
2043 | 815 | endobj | 821 | endobj |
2045 | 816 | 544 0 obj | 822 | 548 0 obj |
2046 | 817 | (vector\137dim) | 823 | (vector\137dim) |
2047 | 818 | endobj | 824 | endobj |
2049 | 819 | 545 0 obj | 825 | 549 0 obj |
2050 | 820 | << /S /GoTo /D (subsection.15.3.5) >> | 826 | << /S /GoTo /D (subsection.15.3.5) >> |
2051 | 821 | endobj | 827 | endobj |
2053 | 822 | 548 0 obj | 828 | 552 0 obj |
2054 | 823 | (tensor\137dim) | 829 | (tensor\137dim) |
2055 | 824 | endobj | 830 | endobj |
2057 | 825 | 549 0 obj | 831 | 553 0 obj |
2058 | 826 | << /S /GoTo /D (chapter.16) >> | 832 | << /S /GoTo /D (chapter.16) >> |
2059 | 827 | endobj | 833 | endobj |
2061 | 828 | 552 0 obj | 834 | 556 0 obj |
2062 | 829 | (Diagnostic statistics) | 835 | (Diagnostic statistics) |
2063 | 830 | endobj | 836 | endobj |
2065 | 831 | 553 0 obj | 837 | 557 0 obj |
2066 | 832 | << /S /GoTo /D (section.16.1) >> | 838 | << /S /GoTo /D (section.16.1) >> |
2067 | 833 | endobj | 839 | endobj |
2069 | 834 | 556 0 obj | 840 | 560 0 obj |
2070 | 835 | (Diagnostic I/O routines) | 841 | (Diagnostic I/O routines) |
2071 | 836 | endobj | 842 | endobj |
2073 | 837 | 557 0 obj | 843 | 561 0 obj |
2074 | 838 | << /S /GoTo /D (section.16.2) >> | 844 | << /S /GoTo /D (section.16.2) >> |
2075 | 839 | endobj | 845 | endobj |
2077 | 840 | 560 0 obj | 846 | 564 0 obj |
2078 | 841 | (Memory statistics) | 847 | (Memory statistics) |
2079 | 842 | endobj | 848 | endobj |
2081 | 843 | 561 0 obj | 849 | 565 0 obj |
2082 | 844 | << /S /GoTo /D (subsection.16.2.1) >> | 850 | << /S /GoTo /D (subsection.16.2.1) >> |
2083 | 845 | endobj | 851 | endobj |
2085 | 846 | 564 0 obj | 852 | 568 0 obj |
2086 | 847 | (print\137current\137memory\137stats) | 853 | (print\137current\137memory\137stats) |
2087 | 848 | endobj | 854 | endobj |
2089 | 849 | 565 0 obj | 855 | 569 0 obj |
2090 | 850 | << /S /GoTo /D (subsection.16.2.2) >> | 856 | << /S /GoTo /D (subsection.16.2.2) >> |
2091 | 851 | endobj | 857 | endobj |
2093 | 852 | 568 0 obj | 858 | 572 0 obj |
2094 | 853 | (print\137memory\137stats) | 859 | (print\137memory\137stats) |
2095 | 854 | endobj | 860 | endobj |
2097 | 855 | 569 0 obj | 861 | 573 0 obj |
2098 | 856 | << /S /GoTo /D (subsection.16.2.3) >> | 862 | << /S /GoTo /D (subsection.16.2.3) >> |
2099 | 857 | endobj | 863 | endobj |
2101 | 858 | 572 0 obj | 864 | 576 0 obj |
2102 | 859 | (reset\137memory\137logs) | 865 | (reset\137memory\137logs) |
2103 | 860 | endobj | 866 | endobj |
2105 | 861 | 573 0 obj | 867 | 577 0 obj |
2106 | 862 | << /S /GoTo /D (section.16.3) >> | 868 | << /S /GoTo /D (section.16.3) >> |
2107 | 863 | endobj | 869 | endobj |
2109 | 864 | 576 0 obj | 870 | 580 0 obj |
2110 | 865 | (Register diagnostics in the .stat file) | 871 | (Register diagnostics in the .stat file) |
2111 | 866 | endobj | 872 | endobj |
2114 | 867 | 577 0 obj | 873 | 581 0 obj |
2115 | 868 | << /S /GoTo /D [578 0 R /Fit ] >> | 874 | << /S /GoTo /D [582 0 R /Fit ] >> |
2116 | 869 | endobj | 875 | endobj |
2119 | 870 | 580 0 obj << | 876 | 584 0 obj << |
2120 | 871 | /Length 132 | 877 | /Length 131 |
2121 | 872 | /Filter /FlateDecode | 878 | /Filter /FlateDecode |
2122 | 873 | >> | 879 | >> |
2123 | 874 | stream | 880 | stream |
2124 | 875 | xÚ3PHW0Ppç2 @;…pé»›+šëšš(„¤)ê™+˜Å,,,BR¢5ÜRsKòósŠ5u�L | ||
2125 | 876 | 4róJs4cC¼ š | 881 | 4róJs4cC¼ š |
2126 | 877 | õ,MM�Àš-õLÌ-t-ÌôŒ- Z}‹4 | 882 | õ,MM�Àš-õLÌ-t-ÌôŒ- Z}‹4 |
2127 | 878 | 4’3 z-t ´‘�¡È | ||
2128 | 879 | '¹†p jJ)ã | 883 | '¹†p jJ)ã |
2129 | 884 | xÚ3PHW0Ppç2 @;…pé»›+šëšš(„¤)ê™+˜Å,,,BR¢5ÜRsKòósŠ5u�L | ||
2130 | 880 | 4róJs4cC¼ š | 885 | 4róJs4cC¼ š |
2131 | 881 | õ,MM�Àš�ôLŒLt-ÌôŒ- Zý“Kò“R‹ : | 886 | õ,MM�Àš�ôLŒLt-ÌôŒ- Zý“Kò“R‹ : |
2132 | 882 | Ít | 887 | Ít |
2133 | #C#�.r | |||
2134 | 883 | á Uú*+ | 888 | á Uú*+ |
2135 | 884 | endstream | 889 | endstream |
2136 | 885 | endobj | 890 | endobj |
2137 | 886 | 578 0 obj << | ||
2138 | 887 | /Type /Page | ||
2139 | 888 | /Contents 580 0 R | ||
2140 | 889 | /Resources 579 0 R | ||
2141 | 890 | /MediaBox [0 0 595.276 841.89] | ||
2142 | 891 | /Parent 584 0 R | ||
2143 | 892 | >> endobj | ||
2144 | 893 | 581 0 obj << | ||
2145 | 894 | /D [578 0 R /XYZ 55.693 817.952 null] | ||
2146 | 895 | >> endobj | ||
2147 | 896 | 582 0 obj << | 891 | 582 0 obj << |
2152 | 897 | /D [578 0 R /XYZ 56.693 785.197 null] | 892 | /Type /Page |
2153 | 898 | >> endobj | 893 | /Contents 584 0 R |
2154 | 899 | 579 0 obj << | 894 | /Resources 583 0 R |
2155 | 900 | /Font << /F37 583 0 R >> | 895 | /MediaBox [0 0 595.276 841.89] |
2156 | 896 | /Parent 588 0 R | ||
2157 | 897 | >> endobj | ||
2158 | 898 | 585 0 obj << | ||
2159 | 899 | /D [582 0 R /XYZ 55.693 817.952 null] | ||
2160 | 900 | >> endobj | ||
2161 | 901 | 586 0 obj << | ||
2162 | 902 | /D [582 0 R /XYZ 56.693 785.197 null] | ||
2163 | 903 | >> endobj | ||
2164 | 904 | 583 0 obj << | ||
2165 | 905 | /Font << /F37 587 0 R >> | ||
2166 | 901 | /ProcSet [ /PDF /Text ] | 906 | /ProcSet [ /PDF /Text ] |
2167 | 902 | >> endobj | 907 | >> endobj |
2169 | 903 | 587 0 obj << | 908 | 591 0 obj << |
2170 | 904 | /Length 68 | 909 | /Length 68 |
2171 | 905 | /Filter /FlateDecode | 910 | /Filter /FlateDecode |
2172 | 906 | >> | 911 | >> |
2173 | @@ -901,21 +907,21 @@ | |||
2174 | 901 | áÒw36W04г4°4TIS05Ó3³4V°00ѳ´4SIQˆÖ0ÒŒ | 907 | áÒw36W04г4°4TIS05Ó3³4V°00ѳ´4SIQˆÖ0ÒŒ |
2175 | 902 | ñâ2€jB§]C¸ ”ê' | 908 | ñâ2€jB§]C¸ ”ê' |
2176 | 903 | endstream | 909 | endstream |
2177 | 904 | endobj | 910 | endobj |
2179 | 905 | 586 0 obj << | 911 | 590 0 obj << |
2180 | 906 | /Type /Page | 912 | /Type /Page |
2183 | 907 | /Contents 587 0 R | 913 | /Contents 591 0 R |
2184 | 908 | /Resources 585 0 R | 914 | /Resources 589 0 R |
2185 | 909 | /MediaBox [0 0 595.276 841.89] | 915 | /MediaBox [0 0 595.276 841.89] |
2193 | 910 | /Parent 584 0 R | 916 | /Parent 588 0 R |
2194 | 911 | >> endobj | 917 | >> endobj |
2195 | 912 | 588 0 obj << | 918 | 592 0 obj << |
2196 | 913 | /D [586 0 R /XYZ 55.693 817.952 null] | 919 | /D [590 0 R /XYZ 55.693 817.952 null] |
2197 | 914 | >> endobj | 920 | >> endobj |
2198 | 915 | 585 0 obj << | 921 | 589 0 obj << |
2199 | 916 | /Font << /F37 583 0 R >> | 922 | /Font << /F37 587 0 R >> |
2200 | 917 | /ProcSet [ /PDF /Text ] | 923 | /ProcSet [ /PDF /Text ] |
2201 | 918 | >> endobj | 924 | >> endobj |
2203 | 919 | 619 0 obj << | 925 | 623 0 obj << |
2204 | 920 | /Length 1083 | 926 | /Length 1083 |
2205 | 921 | /Filter /FlateDecode | 927 | /Filter /FlateDecode |
2206 | 922 | >> | 928 | >> |
2207 | @@ -929,1171 +935,1173 @@ | |||
2208 | 929 | :W7R›îr¿ïÀó+Å!ŠöÏA?¬§ÄLåÁn*ØþîåüâŽYŠ² | 935 | :W7R›îr¿ïÀó+Å!ŠöÏA?¬§ÄLåÁn*ØþîåüâŽYŠ² |
2209 | 930 | endstream | 936 | endstream |
2210 | 931 | endobj | 937 | endobj |
2212 | 932 | 618 0 obj << | 938 | 622 0 obj << |
2213 | 933 | /Type /Page | 939 | /Type /Page |
2216 | 934 | /Contents 619 0 R | 940 | /Contents 623 0 R |
2217 | 935 | /Resources 617 0 R | 941 | /Resources 621 0 R |
2218 | 936 | /MediaBox [0 0 595.276 841.89] | 942 | /MediaBox [0 0 595.276 841.89] |
2221 | 937 | /Parent 584 0 R | 943 | /Parent 588 0 R |
2222 | 938 | /Annots [ 589 0 R 590 0 R 591 0 R 592 0 R 593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R 605 0 R 606 0 R 607 0 R 608 0 R 609 0 R 610 0 R 611 0 R 612 0 R 613 0 R 614 0 R 615 0 R ] | 944 | /Annots [ 593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R 605 0 R 606 0 R 607 0 R 608 0 R 609 0 R 610 0 R 611 0 R 612 0 R 613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R ] |
2223 | 939 | >> endobj | 945 | >> endobj |
2225 | 940 | 589 0 obj << | 946 | 593 0 obj << |
2226 | 941 | /Type /Annot | 947 | /Type /Annot |
2227 | 942 | /Subtype /Link | 948 | /Subtype /Link |
2228 | 943 | /Border[0 0 0]/H/I/C[1 0 0] | 949 | /Border[0 0 0]/H/I/C[1 0 0] |
2229 | 944 | /Rect [55.697 630.532 218.736 641.329] | 950 | /Rect [55.697 630.532 218.736 641.329] |
2230 | 945 | /A << /S /GoTo /D (part.1) >> | 951 | /A << /S /GoTo /D (part.1) >> |
2231 | 946 | >> endobj | 952 | >> endobj |
2233 | 947 | 590 0 obj << | 953 | 594 0 obj << |
2234 | 948 | /Type /Annot | 954 | /Type /Annot |
2235 | 949 | /Subtype /Link | 955 | /Subtype /Link |
2236 | 950 | /Border[0 0 0]/H/I/C[1 0 0] | 956 | /Border[0 0 0]/H/I/C[1 0 0] |
2237 | 951 | /Rect [55.697 597.791 246.448 610.436] | 957 | /Rect [55.697 597.791 246.448 610.436] |
2238 | 952 | /A << /S /GoTo /D (chapter.1) >> | 958 | /A << /S /GoTo /D (chapter.1) >> |
2239 | 953 | >> endobj | 959 | >> endobj |
2241 | 954 | 591 0 obj << | 960 | 595 0 obj << |
2242 | 955 | /Type /Annot | 961 | /Type /Annot |
2243 | 956 | /Subtype /Link | 962 | /Subtype /Link |
2244 | 957 | /Border[0 0 0]/H/I/C[1 0 0] | 963 | /Border[0 0 0]/H/I/C[1 0 0] |
2245 | 958 | /Rect [72.06 581.988 242.05 592.102] | 964 | /Rect [72.06 581.988 242.05 592.102] |
2246 | 959 | /A << /S /GoTo /D (section.1.1) >> | 965 | /A << /S /GoTo /D (section.1.1) >> |
2247 | 960 | >> endobj | 966 | >> endobj |
2249 | 961 | 592 0 obj << | 967 | 596 0 obj << |
2250 | 962 | /Type /Annot | 968 | /Type /Annot |
2251 | 963 | /Subtype /Link | 969 | /Subtype /Link |
2252 | 964 | /Border[0 0 0]/H/I/C[1 0 0] | 970 | /Border[0 0 0]/H/I/C[1 0 0] |
2253 | 965 | /Rect [72.06 563.544 220.212 573.658] | 971 | /Rect [72.06 563.544 220.212 573.658] |
2254 | 966 | /A << /S /GoTo /D (section.1.2) >> | 972 | /A << /S /GoTo /D (section.1.2) >> |
2255 | 967 | >> endobj | 973 | >> endobj |
2257 | 968 | 593 0 obj << | 974 | 597 0 obj << |
2258 | 969 | /Type /Annot | 975 | /Type /Annot |
2259 | 970 | /Subtype /Link | 976 | /Subtype /Link |
2260 | 971 | /Border[0 0 0]/H/I/C[1 0 0] | 977 | /Border[0 0 0]/H/I/C[1 0 0] |
2261 | 972 | /Rect [72.06 545.101 194.019 555.215] | 978 | /Rect [72.06 545.101 194.019 555.215] |
2262 | 973 | /A << /S /GoTo /D (section.1.3) >> | 979 | /A << /S /GoTo /D (section.1.3) >> |
2263 | 974 | >> endobj | 980 | >> endobj |
2265 | 975 | 594 0 obj << | 981 | 598 0 obj << |
2266 | 976 | /Type /Annot | 982 | /Type /Annot |
2267 | 977 | /Subtype /Link | 983 | /Subtype /Link |
2268 | 978 | /Border[0 0 0]/H/I/C[1 0 0] | 984 | /Border[0 0 0]/H/I/C[1 0 0] |
2269 | 979 | /Rect [72.06 523.756 206.498 536.772] | 985 | /Rect [72.06 523.756 206.498 536.772] |
2270 | 980 | /A << /S /GoTo /D (section.1.4) >> | 986 | /A << /S /GoTo /D (section.1.4) >> |
2271 | 981 | >> endobj | 987 | >> endobj |
2273 | 982 | 595 0 obj << | 988 | 599 0 obj << |
2274 | 983 | /Type /Annot | 989 | /Type /Annot |
2275 | 984 | /Subtype /Link | 990 | /Subtype /Link |
2276 | 985 | /Border[0 0 0]/H/I/C[1 0 0] | 991 | /Border[0 0 0]/H/I/C[1 0 0] |
2277 | 986 | /Rect [97.151 505.312 292.745 518.328] | 992 | /Rect [97.151 505.312 292.745 518.328] |
2278 | 987 | /A << /S /GoTo /D (subsection.1.4.1) >> | 993 | /A << /S /GoTo /D (subsection.1.4.1) >> |
2279 | 988 | >> endobj | 994 | >> endobj |
2281 | 989 | 596 0 obj << | 995 | 600 0 obj << |
2282 | 990 | /Type /Annot | 996 | /Type /Annot |
2283 | 991 | /Subtype /Link | 997 | /Subtype /Link |
2284 | 992 | /Border[0 0 0]/H/I/C[1 0 0] | 998 | /Border[0 0 0]/H/I/C[1 0 0] |
2285 | 993 | /Rect [97.151 486.869 343.014 499.885] | 999 | /Rect [97.151 486.869 343.014 499.885] |
2286 | 994 | /A << /S /GoTo /D (subsection.1.4.2) >> | 1000 | /A << /S /GoTo /D (subsection.1.4.2) >> |
2287 | 995 | >> endobj | 1001 | >> endobj |
2289 | 996 | 597 0 obj << | 1002 | 601 0 obj << |
2290 | 997 | /Type /Annot | 1003 | /Type /Annot |
2291 | 998 | /Subtype /Link | 1004 | /Subtype /Link |
2292 | 999 | /Border[0 0 0]/H/I/C[1 0 0] | 1005 | /Border[0 0 0]/H/I/C[1 0 0] |
2293 | 1000 | /Rect [72.06 471.327 222.371 481.442] | 1006 | /Rect [72.06 471.327 222.371 481.442] |
2294 | 1001 | /A << /S /GoTo /D (section.1.5) >> | 1007 | /A << /S /GoTo /D (section.1.5) >> |
2295 | 1002 | >> endobj | 1008 | >> endobj |
2297 | 1003 | 598 0 obj << | 1009 | 602 0 obj << |
2298 | 1004 | /Type /Annot | 1010 | /Type /Annot |
2299 | 1005 | /Subtype /Link | 1011 | /Subtype /Link |
2300 | 1006 | /Border[0 0 0]/H/I/C[1 0 0] | 1012 | /Border[0 0 0]/H/I/C[1 0 0] |
2301 | 1007 | /Rect [55.697 438.459 274.735 451.191] | 1013 | /Rect [55.697 438.459 274.735 451.191] |
2302 | 1008 | /A << /S /GoTo /D (chapter.2) >> | 1014 | /A << /S /GoTo /D (chapter.2) >> |
2303 | 1009 | >> endobj | 1015 | >> endobj |
2305 | 1010 | 599 0 obj << | 1016 | 603 0 obj << |
2306 | 1011 | /Type /Annot | 1017 | /Type /Annot |
2307 | 1012 | /Subtype /Link | 1018 | /Subtype /Link |
2308 | 1013 | /Border[0 0 0]/H/I/C[1 0 0] | 1019 | /Border[0 0 0]/H/I/C[1 0 0] |
2309 | 1014 | /Rect [72.06 419.841 227.378 432.857] | 1020 | /Rect [72.06 419.841 227.378 432.857] |
2310 | 1015 | /A << /S /GoTo /D (section.2.1) >> | 1021 | /A << /S /GoTo /D (section.2.1) >> |
2311 | 1016 | >> endobj | 1022 | >> endobj |
2313 | 1017 | 600 0 obj << | 1023 | 604 0 obj << |
2314 | 1018 | /Type /Annot | 1024 | /Type /Annot |
2315 | 1019 | /Subtype /Link | 1025 | /Subtype /Link |
2316 | 1020 | /Border[0 0 0]/H/I/C[1 0 0] | 1026 | /Border[0 0 0]/H/I/C[1 0 0] |
2317 | 1021 | /Rect [97.151 401.397 214.059 414.413] | 1027 | /Rect [97.151 401.397 214.059 414.413] |
2318 | 1022 | /A << /S /GoTo /D (subsection.2.1.1) >> | 1028 | /A << /S /GoTo /D (subsection.2.1.1) >> |
2319 | 1023 | >> endobj | 1029 | >> endobj |
2321 | 1024 | 601 0 obj << | 1030 | 605 0 obj << |
2322 | 1025 | /Type /Annot | 1031 | /Type /Annot |
2323 | 1026 | /Subtype /Link | 1032 | /Subtype /Link |
2324 | 1027 | /Border[0 0 0]/H/I/C[1 0 0] | 1033 | /Border[0 0 0]/H/I/C[1 0 0] |
2325 | 1028 | /Rect [97.151 382.954 258.011 395.97] | 1034 | /Rect [97.151 382.954 258.011 395.97] |
2326 | 1029 | /A << /S /GoTo /D (subsection.2.1.2) >> | 1035 | /A << /S /GoTo /D (subsection.2.1.2) >> |
2327 | 1030 | >> endobj | 1036 | >> endobj |
2329 | 1031 | 602 0 obj << | 1037 | 606 0 obj << |
2330 | 1032 | /Type /Annot | 1038 | /Type /Annot |
2331 | 1033 | /Subtype /Link | 1039 | /Subtype /Link |
2332 | 1034 | /Border[0 0 0]/H/I/C[1 0 0] | 1040 | /Border[0 0 0]/H/I/C[1 0 0] |
2333 | 1035 | /Rect [72.06 367.412 307.788 377.527] | 1041 | /Rect [72.06 367.412 307.788 377.527] |
2334 | 1036 | /A << /S /GoTo /D (section.2.2) >> | 1042 | /A << /S /GoTo /D (section.2.2) >> |
2335 | 1037 | >> endobj | 1043 | >> endobj |
2337 | 1038 | 603 0 obj << | 1044 | 607 0 obj << |
2338 | 1039 | /Type /Annot | 1045 | /Type /Annot |
2339 | 1040 | /Subtype /Link | 1046 | /Subtype /Link |
2340 | 1041 | /Border[0 0 0]/H/I/C[1 0 0] | 1047 | /Border[0 0 0]/H/I/C[1 0 0] |
2341 | 1042 | /Rect [97.151 348.969 239.324 359.083] | 1048 | /Rect [97.151 348.969 239.324 359.083] |
2342 | 1043 | /A << /S /GoTo /D (subsection.2.2.1) >> | 1049 | /A << /S /GoTo /D (subsection.2.2.1) >> |
2343 | 1044 | >> endobj | 1050 | >> endobj |
2345 | 1045 | 604 0 obj << | 1051 | 608 0 obj << |
2346 | 1046 | /Type /Annot | 1052 | /Type /Annot |
2347 | 1047 | /Subtype /Link | 1053 | /Subtype /Link |
2348 | 1048 | /Border[0 0 0]/H/I/C[1 0 0] | 1054 | /Border[0 0 0]/H/I/C[1 0 0] |
2349 | 1049 | /Rect [55.697 318.806 224.641 328.833] | 1055 | /Rect [55.697 318.806 224.641 328.833] |
2350 | 1050 | /A << /S /GoTo /D (chapter.3) >> | 1056 | /A << /S /GoTo /D (chapter.3) >> |
2351 | 1051 | >> endobj | 1057 | >> endobj |
2353 | 1052 | 605 0 obj << | 1058 | 609 0 obj << |
2354 | 1053 | /Type /Annot | 1059 | /Type /Annot |
2355 | 1054 | /Subtype /Link | 1060 | /Subtype /Link |
2356 | 1055 | /Border[0 0 0]/H/I/C[1 0 0] | 1061 | /Border[0 0 0]/H/I/C[1 0 0] |
2357 | 1056 | /Rect [72.06 297.483 284.465 310.499] | 1062 | /Rect [72.06 297.483 284.465 310.499] |
2358 | 1057 | /A << /S /GoTo /D (section.3.1) >> | 1063 | /A << /S /GoTo /D (section.3.1) >> |
2359 | 1058 | >> endobj | 1064 | >> endobj |
2361 | 1059 | 606 0 obj << | 1065 | 610 0 obj << |
2362 | 1060 | /Type /Annot | 1066 | /Type /Annot |
2363 | 1061 | /Subtype /Link | 1067 | /Subtype /Link |
2364 | 1062 | /Border[0 0 0]/H/I/C[1 0 0] | 1068 | /Border[0 0 0]/H/I/C[1 0 0] |
2365 | 1063 | /Rect [72.06 279.039 232.844 292.055] | 1069 | /Rect [72.06 279.039 232.844 292.055] |
2366 | 1064 | /A << /S /GoTo /D (section.3.2) >> | 1070 | /A << /S /GoTo /D (section.3.2) >> |
2367 | 1065 | >> endobj | 1071 | >> endobj |
2369 | 1066 | 607 0 obj << | 1072 | 611 0 obj << |
2370 | 1067 | /Type /Annot | 1073 | /Type /Annot |
2371 | 1068 | /Subtype /Link | 1074 | /Subtype /Link |
2372 | 1069 | /Border[0 0 0]/H/I/C[1 0 0] | 1075 | /Border[0 0 0]/H/I/C[1 0 0] |
2373 | 1070 | /Rect [55.697 235.158 183.863 248.92] | 1076 | /Rect [55.697 235.158 183.863 248.92] |
2374 | 1071 | /A << /S /GoTo /D (part.2) >> | 1077 | /A << /S /GoTo /D (part.2) >> |
2375 | 1072 | >> endobj | 1078 | >> endobj |
2377 | 1073 | 608 0 obj << | 1079 | 612 0 obj << |
2378 | 1074 | /Type /Annot | 1080 | /Type /Annot |
2379 | 1075 | /Subtype /Link | 1081 | /Subtype /Link |
2380 | 1076 | /Border[0 0 0]/H/I/C[1 0 0] | 1082 | /Border[0 0 0]/H/I/C[1 0 0] |
2381 | 1077 | /Rect [55.697 208 233.728 218.027] | 1083 | /Rect [55.697 208 233.728 218.027] |
2382 | 1078 | /A << /S /GoTo /D (chapter.4) >> | 1084 | /A << /S /GoTo /D (chapter.4) >> |
2383 | 1079 | >> endobj | 1085 | >> endobj |
2385 | 1080 | 609 0 obj << | 1086 | 613 0 obj << |
2386 | 1081 | /Type /Annot | 1087 | /Type /Annot |
2387 | 1082 | /Subtype /Link | 1088 | /Subtype /Link |
2388 | 1083 | /Border[0 0 0]/H/I/C[1 0 0] | 1089 | /Border[0 0 0]/H/I/C[1 0 0] |
2389 | 1084 | /Rect [72.06 186.677 282.818 199.693] | 1090 | /Rect [72.06 186.677 282.818 199.693] |
2390 | 1085 | /A << /S /GoTo /D (section.4.1) >> | 1091 | /A << /S /GoTo /D (section.4.1) >> |
2391 | 1086 | >> endobj | 1092 | >> endobj |
2393 | 1087 | 610 0 obj << | 1093 | 614 0 obj << |
2394 | 1088 | /Type /Annot | 1094 | /Type /Annot |
2395 | 1089 | /Subtype /Link | 1095 | /Subtype /Link |
2396 | 1090 | /Border[0 0 0]/H/I/C[1 0 0] | 1096 | /Border[0 0 0]/H/I/C[1 0 0] |
2397 | 1091 | /Rect [72.06 168.233 256.691 181.249] | 1097 | /Rect [72.06 168.233 256.691 181.249] |
2398 | 1092 | /A << /S /GoTo /D (section.4.2) >> | 1098 | /A << /S /GoTo /D (section.4.2) >> |
2399 | 1093 | >> endobj | 1099 | >> endobj |
2401 | 1094 | 611 0 obj << | 1100 | 615 0 obj << |
2402 | 1095 | /Type /Annot | 1101 | /Type /Annot |
2403 | 1096 | /Subtype /Link | 1102 | /Subtype /Link |
2404 | 1097 | /Border[0 0 0]/H/I/C[1 0 0] | 1103 | /Border[0 0 0]/H/I/C[1 0 0] |
2405 | 1098 | /Rect [72.06 149.79 318.337 162.806] | 1104 | /Rect [72.06 149.79 318.337 162.806] |
2406 | 1099 | /A << /S /GoTo /D (section.4.3) >> | 1105 | /A << /S /GoTo /D (section.4.3) >> |
2407 | 1100 | >> endobj | 1106 | >> endobj |
2409 | 1101 | 612 0 obj << | 1107 | 616 0 obj << |
2410 | 1102 | /Type /Annot | 1108 | /Type /Annot |
2411 | 1103 | /Subtype /Link | 1109 | /Subtype /Link |
2412 | 1104 | /Border[0 0 0]/H/I/C[1 0 0] | 1110 | /Border[0 0 0]/H/I/C[1 0 0] |
2413 | 1105 | /Rect [55.697 120.718 131.62 132.555] | 1111 | /Rect [55.697 120.718 131.62 132.555] |
2414 | 1106 | /A << /S /GoTo /D (chapter.5) >> | 1112 | /A << /S /GoTo /D (chapter.5) >> |
2415 | 1107 | >> endobj | 1113 | >> endobj |
2417 | 1108 | 613 0 obj << | 1114 | 617 0 obj << |
2418 | 1109 | /Type /Annot | 1115 | /Type /Annot |
2419 | 1110 | /Subtype /Link | 1116 | /Subtype /Link |
2420 | 1111 | /Border[0 0 0]/H/I/C[1 0 0] | 1117 | /Border[0 0 0]/H/I/C[1 0 0] |
2421 | 1112 | /Rect [55.697 92.387 120.1 102.414] | 1118 | /Rect [55.697 92.387 120.1 102.414] |
2422 | 1113 | /A << /S /GoTo /D (chapter.6) >> | 1119 | /A << /S /GoTo /D (chapter.6) >> |
2423 | 1114 | >> endobj | 1120 | >> endobj |
2425 | 1115 | 614 0 obj << | 1121 | 618 0 obj << |
2426 | 1116 | /Type /Annot | 1122 | /Type /Annot |
2427 | 1117 | /Subtype /Link | 1123 | /Subtype /Link |
2428 | 1118 | /Border[0 0 0]/H/I/C[1 0 0] | 1124 | /Border[0 0 0]/H/I/C[1 0 0] |
2429 | 1119 | /Rect [72.06 71.064 277.701 84.08] | 1125 | /Rect [72.06 71.064 277.701 84.08] |
2430 | 1120 | /A << /S /GoTo /D (section.6.1) >> | 1126 | /A << /S /GoTo /D (section.6.1) >> |
2431 | 1121 | >> endobj | 1127 | >> endobj |
2433 | 1122 | 615 0 obj << | 1128 | 619 0 obj << |
2434 | 1123 | /Type /Annot | 1129 | /Type /Annot |
2435 | 1124 | /Subtype /Link | 1130 | /Subtype /Link |
2436 | 1125 | /Border[0 0 0]/H/I/C[1 0 0] | 1131 | /Border[0 0 0]/H/I/C[1 0 0] |
2437 | 1126 | /Rect [72.06 52.62 320.584 65.636] | 1132 | /Rect [72.06 52.62 320.584 65.636] |
2438 | 1127 | /A << /S /GoTo /D (section.6.2) >> | 1133 | /A << /S /GoTo /D (section.6.2) >> |
2439 | 1128 | >> endobj | 1134 | >> endobj |
2440 | 1135 | 624 0 obj << | ||
2441 | 1136 | /D [622 0 R /XYZ 55.693 817.952 null] | ||
2442 | 1137 | >> endobj | ||
2443 | 1138 | 626 0 obj << | ||
2444 | 1139 | /D [622 0 R /XYZ 56.693 649.543 null] | ||
2445 | 1140 | >> endobj | ||
2446 | 1141 | 621 0 obj << | ||
2447 | 1142 | /Font << /F50 625 0 R /F37 587 0 R >> | ||
2448 | 1143 | /ProcSet [ /PDF /Text ] | ||
2449 | 1144 | >> endobj | ||
2450 | 1145 | 664 0 obj << | ||
2451 | 1146 | /Length 1339 | ||
2452 | 1147 | /Filter /FlateDecode | ||
2453 | 1148 | >> | ||
2454 | 1149 | stream | ||
2455 | 1150 | xÚíZËr£FÝë+XJU¡§ß�eâØ.Oeœd¬ÊÆ™†¶LŠ‡PÍÌߧy4 EÏ©‰-m | ||
2456 | 1129 | 2¨�ÓçÞs/ | 1151 | 2¨�ÓçÞs/ |
2457 | 1130 | �™�ÛÑ/ÓÑ»" | 1152 | �™�ÛÑ/ÓÑ»" |
2458 | 1131 | �‚ | 1153 | �‚ |
2459 | 1154 | 9Óg‡qÀq$¤@)îLçqL'Ÿ¦ïßÝ0²z#ÅpIÌ8Õ=W¿ßO¯ï§å#ØŒÍ_ädå‡òäãí`:—BRŽK LÖƒq@&.‚ | ||
2460 | 1132 | ŽK}/š¸Øœ&i ›³Eü¤³0™u&s | 1155 | ŽK}/š¸Øœ&i ›³Eü¤³0™u&s |
2461 | 1133 | ]ÎùL\ák:P¥N6XD1 | 1156 | ]ÎùL\ák:P¥N6XD1 |
2462 | 1134 | ¶…st‘„c | 1157 | ¶…st‘„c |
2463 | 1135 | ?mà¿zñ’Y t…»Ÿ¦ÙÉq&^¡óþdêU¢JBß | 1158 | ?mà¿zñ’Y t…»Ÿ¦ÙÉq&^¡óþdêU¢JBß |
2464 | 1136 | v$�ÌòçÔq±‚КQbæø ó—>òT˜/Kd•HDsy»ö | 1159 | v$�ÌòçÔq±‚КQbæø ó—>òT˜/Kd•HDsy»ö |
2465 | 1137 | ‰.ù †üûVp^Ô':Ò±NŠ-2$Tœ«ÔÄžR 7hdžÙêË×ÓÑçj¾‚°¡È,.•¡J:~<zü�À\|ï@@”t¾T·ÆX”á8r | 1160 | ‰.ù †üûVp^Ô':Ò±NŠ-2$Tœ«ÔÄžR 7hdžÙêË×ÓÑçj¾‚°¡È,.•¡J:~<zü�À\|ï@@”t¾T·ÆX”á8r |
2466 | 1138 | F® | 1161 | F® |
2467 | 1139 | í | 1162 | í |
2468 | 1140 | s.ª±(jBmñm®û?Epøz…ücÑA‹a |� F=åËFù7¡Ž‚-ÊWG)_¶Êÿk‚k¿0ñ¾ | 1163 | s.ª±(jBmñm®û?Epøz…ücÑA‹a |� F=åËFù7¡Ž‚-ÊWG)_¶Êÿk‚k¿0ñ¾ |
2469 | 1164 | �äöŸCˆ‡Ïôhžž^òÀp5¨]C²tØÐPQ_c | ||
2470 | 1141 | x…×0a„;€žSu>š; -î±eëM¯Ò$/<› | 1165 | x…×0a„;€žSu>š; -î±eëM¯Ò$/<› |
2471 | 1142 | 7«��]4< | 1166 | 7«��]4< |
2472 | 1143 | 3hof¬m�¾èuŽµCÔÀ´y¡äô”0KÉDáq:O£t¶%]›V–a-�ÁÌÃ4TJž��< |
Hey, is this still up for review? There seems to be some commented out code and print statements in here...