00001 typedef unsigned long size_t; 00002 typedef long fpos_t; 00003 #pragma pack( 8 ) 00004 struct _Kee1 { 00005 int _cnt; 00006 unsigned char *_ptr; 00007 unsigned char *_base; 00008 int _bufsiz; 00009 short _flag; 00010 short _file; 00011 char *__newbase; 00012 void *_lock; 00013 unsigned char *_bufendp; 00014 } ; 00015 typedef struct _Kee1 FILE; 00016 extern struct _Kee1 _iob[]; 00017 extern int fread( ); 00018 extern int fwrite( ); 00019 extern int _flsbuf( ); 00020 extern int _filbuf( ); 00021 extern int ferror( ); 00022 extern int feof( ); 00023 extern void clearerr( ); 00024 extern int putchar( ); 00025 extern int getchar( ); 00026 extern int putc( ); 00027 extern int getc( ); 00028 extern int remove( ); 00029 extern int rename( ); 00030 extern struct _Kee1 *tmpfile( ); 00031 extern char *tmpnam( ); 00032 extern int fclose( ); 00033 extern int fflush( ); 00034 extern struct _Kee1 *fopen( ); 00035 extern struct _Kee1 *freopen( ); 00036 extern void setbuf( ); 00037 extern int setvbuf( ); 00038 extern int fprintf( ); 00039 extern int fscanf( ); 00040 extern int printf( ); 00041 extern int scanf( ); 00042 extern int sprintf( ); 00043 extern int sscanf( ); 00044 struct _Kee2 { 00045 char * *_a0; 00046 int _offset; 00047 } ; 00048 typedef struct _Kee2 va_list; 00049 extern int vfprintf( ); 00050 extern int vprintf( ); 00051 extern int vsprintf( ); 00052 extern int fgetc( ); 00053 extern char *fgets( ); 00054 extern int fputc( ); 00055 extern int fputs( ); 00056 extern char *gets( ); 00057 extern int puts( ); 00058 extern int ungetc( ); 00059 extern int fgetpos( ); 00060 extern int fseek( ); 00061 extern int fsetpos( ); 00062 extern long ftell( ); 00063 extern void rewind( ); 00064 extern void perror( ); 00065 typedef signed long ptrdiff_t; 00066 typedef unsigned int wchar_t; 00067 typedef unsigned int wctype_t; 00068 typedef int time_t; 00069 typedef int clock_t; 00070 typedef long ssize_t; 00071 typedef unsigned char uchar_t; 00072 typedef unsigned short ushort_t; 00073 typedef unsigned int uint_t; 00074 typedef unsigned long ulong_t; 00075 typedef volatile unsigned char vuchar_t; 00076 typedef volatile unsigned short vushort_t; 00077 typedef volatile unsigned int vuint_t; 00078 typedef volatile unsigned long vulong_t; 00079 struct _Kee3 { 00080 long r[1]; 00081 } ; 00082 typedef struct _Kee3 *physadr_t; 00083 struct label_t { 00084 long val[10]; 00085 } ; 00086 typedef struct label_t label_t; 00087 typedef int level_t; 00088 typedef int daddr_t; 00089 typedef char *caddr_t; 00090 typedef long *qaddr_t; 00091 typedef char *addr_t; 00092 typedef unsigned int ino_t; 00093 typedef short cnt_t; 00094 typedef int dev_t; 00095 typedef int chan_t; 00096 typedef long off_t; 00097 typedef unsigned long rlim_t; 00098 typedef int paddr_t; 00099 typedef unsigned short nlink_t; 00100 typedef int key_t; 00101 typedef unsigned int mode_t; 00102 typedef unsigned int uid_t; 00103 typedef unsigned int gid_t; 00104 typedef void *mid_t; 00105 typedef int pid_t; 00106 typedef char slab_t[12]; 00107 typedef unsigned long shmatt_t; 00108 typedef unsigned long msgqnum_t; 00109 typedef unsigned long msglen_t; 00110 typedef unsigned int wint_t; 00111 typedef unsigned long sigset_t; 00112 typedef long timer_t; 00113 typedef void (*sig_t)( ); 00114 typedef int id_t; 00115 typedef unsigned int major_t; 00116 typedef unsigned int minor_t; 00117 typedef unsigned int devs_t; 00118 typedef unsigned int unit_t; 00119 typedef unsigned long vm_offset_t; 00120 typedef unsigned long vm_size_t; 00121 typedef unsigned char uchar; 00122 typedef unsigned short ushort; 00123 typedef unsigned int uint; 00124 typedef unsigned long ulong; 00125 typedef struct _Kee3 *physadr; 00126 typedef unsigned char u_char; 00127 typedef unsigned short u_short; 00128 typedef unsigned int u_int; 00129 typedef unsigned long u_long; 00130 typedef volatile unsigned char vu_char; 00131 typedef volatile unsigned short vu_short; 00132 typedef volatile unsigned int vu_int; 00133 typedef volatile unsigned long vu_long; 00134 struct _quad { 00135 int val[2]; 00136 } ; 00137 typedef struct _quad quad; 00138 typedef long swblk_t; 00139 typedef unsigned long fixpt_t; 00140 typedef int fd_mask; 00141 struct fd_set { 00142 int fds_bits[128]; 00143 } ; 00144 typedef struct fd_set fd_set; 00145 extern void bzero( ); 00146 #pragma pack( 0 ) 00147 struct timeval ; 00148 int select( ); 00149 extern int fileno( ); 00150 extern struct _Kee1 *fdopen( ); 00151 extern char *cuserid( ); 00152 extern int getopt( ); 00153 extern char *optarg; 00154 extern int optind; 00155 extern int optopt; 00156 extern int opterr; 00157 extern char *ctermid( ); 00158 extern int getw( ); 00159 extern int pclose( ); 00160 extern int putw( ); 00161 extern struct _Kee1 *popen( ); 00162 extern char *tempnam( ); 00163 extern void setbuffer( ); 00164 extern void setlinebuf( ); 00165 unsigned int h3wait_( ); 00166 int npipes = 3; 00167 double xjmem[1000][3]; 00168 double vjmem[1000][3]; 00169 double xjpred[1000][3]; 00170 double vjpred[1000][3]; 00171 double ajmem[1000][3]; 00172 double jjmem[1000][3]; 00173 double mjmem[1000]; 00174 double tjmem[1000]; 00175 double xjbuf[50][26][3]; 00176 double vjbuf[50][26][3]; 00177 double ajbuf[50][26][3]; 00178 double jjbuf[50][26][3]; 00179 double mjbuf[50][26]; 00180 double tjbuf[50][26]; 00181 int indexbuf[50][26]; 00182 int njbuf[50]; 00183 double timem; 00184 double ximem[3][3]; 00185 double vimem[3][3]; 00186 double hmem[3]; 00187 double epsmem[3]; 00188 int nnb[3]; 00189 int nb[3][1024]; 00190 static int debug_level = 0; 00191 void h3open_( ) 00192 00193 { 00194 00195 } 00196 void h3close_( ) 00197 00198 { 00199 00200 } 00201 int h3npipe_( ) 00202 00203 { 00204 00205 return npipes; 00206 } 00207 void h3setnboards_( nb ) 00208 int *nb; 00209 00210 { 00211 00212 } 00213 int h3getnboards_( ) 00214 00215 { 00216 00217 return 1; 00218 } 00219 unsigned int h3wait_( ) 00220 00221 { 00222 00223 return 0; 00224 } 00225 void h3setti_( ti ) 00226 double *ti; 00227 00228 { 00229 00230 timem = ti[0]; 00231 } 00232 int h3jpmax_( ) 00233 00234 { 00235 00236 return 26; 00237 } 00238 void h3setmode_( ) 00239 00240 { 00241 00242 } 00243 void h3jpdma_indirect_( int *, int *, double [][3], double [][3], double [][3], double [][3], double *, double *, int * ); 00244 void h3mjpdma_indirect_( int *, int *, double [][3], double [][3], double [][3], double [][3], double *, double *, int *, 00245 int * ); 00246 void h3mjpdma_start_( int * ); 00247 void h3mjpdma_flush_( ); 00248 void h3jpdma_indirect_( nj, hostindex, xj, vj, aj, jj, mj, tj, mode ) 00249 int *nj; 00250 int *hostindex; 00251 double (*xj)[3]; 00252 double (*vj)[3]; 00253 double (*aj)[3]; 00254 double (*jj)[3]; 00255 double *mj; 00256 double *tj; 00257 int *mode; 00258 00259 { 00260 int zero; 00261 00262 zero = 0; 00263 h3mjpdma_indirect_( nj, hostindex, xj, vj, aj, jj, mj, tj, mode, &zero ); 00264 h3mjpdma_start_( &zero ); 00265 } 00266 static int buff_used = 0; 00267 void h3mjpdma_indirect_( nj, hostindex, xj, vj, aj, jj, mj, tj, mode, buff_id ) 00268 int *nj; 00269 int *hostindex; 00270 double (*xj)[3]; 00271 double (*vj)[3]; 00272 double (*aj)[3]; 00273 double (*jj)[3]; 00274 double *mj; 00275 double *tj; 00276 int *mode; 00277 int *buff_id; 00278 00279 { 00280 register int i; 00281 int bufno; 00282 int k; 00283 int hostid; 00284 long _Kii1; 00285 00286 if (debug_level) { 00287 fprintf( (_iob + 2), "(h3mjpdma) called %d %d\n", (nj[0]), (mode[0]) ); 00288 } 00289 if (nj[0] > 26) { 00290 fprintf( (_iob + 2), "(h3jpdma) Too large nj (%d > %d\n", nj, 26 ); 00291 exit( ((-1)) ); 00292 } 00293 if (buff_id[0] >= 0) { 00294 bufno = buff_id[0]; 00295 } else { 00296 bufno = buff_used; 00297 buff_used++; 00298 } 00299 njbuf[bufno] = nj[0]; 00300 i = 0; 00301 _Kii1 = ((void *)(xjbuf[bufno][i] + 2) < (void *)(vjbuf[bufno][i]) || (void *)(xjbuf[bufno][i]) > (void *)(vjbuf[bufno][i] 00302 + 2)) && ((void *)(xjbuf[bufno][i] + 2) < (void *)(ajbuf[bufno][i]) || (void *)(xjbuf[bufno][i]) > (void *)(ajbuf[ 00303 bufno][i] + 2)) && ((void *)(xjbuf[bufno][i] + 2) < (void *)(jjbuf[bufno][i]) || (void *)(xjbuf[bufno][i]) > (void *)( 00304 jjbuf[bufno][i] + 2)) && ((void *)(xjbuf[bufno][i] + 2) < (void *)(xj[hostid]) || (void *)(xjbuf[bufno][i]) > (void *) 00305 (xj[hostid] + 2)) && ((void *)(xjbuf[bufno][i] + 2) < (void *)(vj[hostid]) || (void *)(xjbuf[bufno][i]) > (void *)(vj[ 00306 hostid] + 2)) && ((void *)(xjbuf[bufno][i] + 2) < (void *)(aj[hostid]) || (void *)(xjbuf[bufno][i]) > (void *)(aj[ 00307 hostid] + 2)) && ((void *)(xjbuf[bufno][i] + 2) < (void *)(jj[hostid]) || (void *)(xjbuf[bufno][i]) > (void *)(jj[ 00308 hostid] + 2)) && ((void *)(vjbuf[bufno][i] + 2) < (void *)(ajbuf[bufno][i]) || (void *)(vjbuf[bufno][i]) > (void *)( 00309 ajbuf[bufno][i] + 2)) && ((void *)(vjbuf[bufno][i] + 2) < (void *)(jjbuf[bufno][i]) || (void *)(vjbuf[bufno][i]) > ( 00310 void *)(jjbuf[bufno][i] + 2)) && ((void *)(vjbuf[bufno][i] + 2) < (void *)(xj[hostid]) || (void *)(vjbuf[bufno][i]) > 00311 (void *)(xj[hostid] + 2)) && ((void *)(vjbuf[bufno][i] + 2) < (void *)(vj[hostid]) || (void *)(vjbuf[bufno][i]) > ( 00312 void *)(vj[hostid] + 2)) && ((void *)(vjbuf[bufno][i] + 2) < (void *)(aj[hostid]) || (void *)(vjbuf[bufno][i]) > ( 00313 void *)(aj[hostid] + 2)) && ((void *)(vjbuf[bufno][i] + 2) < (void *)(jj[hostid]) || (void *)(vjbuf[bufno][i]) > ( 00314 void *)(jj[hostid] + 2)) && ((void *)(ajbuf[bufno][i] + 2) < (void *)(jjbuf[bufno][i]) || (void *)(ajbuf[bufno][i]) > 00315 (void *)(jjbuf[bufno][i] + 2)) && ((void *)(ajbuf[bufno][i] + 2) < (void *)(xj[hostid]) || (void *)(ajbuf[bufno][i]) 00316 > (void *)(xj[hostid] + 2)) && ((void *)(ajbuf[bufno][i] + 2) < (void *)(vj[hostid]) || (void *)(ajbuf[bufno][i]) > ( 00317 void *)(vj[hostid] + 2)) && ((void *)(ajbuf[bufno][i] + 2) < (void *)(aj[hostid]) || (void *)(ajbuf[bufno][i]) > ( 00318 void *)(aj[hostid] + 2)) && ((void *)(ajbuf[bufno][i] + 2) < (void *)(jj[hostid]) || (void *)(ajbuf[bufno][i]) > ( 00319 void *)(jj[hostid] + 2)) && ((void *)(jjbuf[bufno][i] + 2) < (void *)(xj[hostid]) || (void *)(jjbuf[bufno][i]) > ( 00320 void *)(xj[hostid] + 2)) && ((void *)(jjbuf[bufno][i] + 2) < (void *)(vj[hostid]) || (void *)(jjbuf[bufno][i]) > ( 00321 void *)(vj[hostid] + 2)) && ((void *)(jjbuf[bufno][i] + 2) < (void *)(aj[hostid]) || (void *)(jjbuf[bufno][i]) > ( 00322 void *)(aj[hostid] + 2)) && ((void *)(jjbuf[bufno][i] + 2) < (void *)(jj[hostid]) || (void *)(jjbuf[bufno][i]) > ( 00323 void *)(jj[hostid] + 2)); 00324 if (!_Kii1) { 00325 while ( i < nj[0] ) { 00326 hostid = hostindex[i] - 1; 00327 xjbuf[bufno][i][0] = xj[hostid][0]; 00328 vjbuf[bufno][i][0] = vj[hostid][0]; 00329 ajbuf[bufno][i][0] = aj[hostid][0]; 00330 jjbuf[bufno][i][0] = jj[hostid][0]; 00331 xjbuf[bufno][i][1] = xj[hostid][1]; 00332 vjbuf[bufno][i][1] = vj[hostid][1]; 00333 ajbuf[bufno][i][1] = aj[hostid][1]; 00334 jjbuf[bufno][i][1] = jj[hostid][1]; 00335 xjbuf[bufno][i][2] = xj[hostid][2]; 00336 vjbuf[bufno][i][2] = vj[hostid][2]; 00337 ajbuf[bufno][i][2] = aj[hostid][2]; 00338 jjbuf[bufno][i][2] = jj[hostid][2]; 00339 tjbuf[bufno][i] = tj[hostid]; 00340 mjbuf[bufno][i] = mj[hostid]; 00341 indexbuf[bufno][i] = hostid; 00342 i++; 00343 } 00344 } else { 00345 while ( i < nj[0] ) { 00346 hostid = hostindex[i] - 1; 00347 xjbuf[bufno][i][0] = xj[hostid][0]; 00348 xjbuf[bufno][i][1] = xj[hostid][1]; 00349 xjbuf[bufno][i][2] = xj[hostid][2]; 00350 vjbuf[bufno][i][0] = vj[hostid][0]; 00351 vjbuf[bufno][i][1] = vj[hostid][1]; 00352 vjbuf[bufno][i][2] = vj[hostid][2]; 00353 ajbuf[bufno][i][0] = aj[hostid][0]; 00354 ajbuf[bufno][i][1] = aj[hostid][1]; 00355 ajbuf[bufno][i][2] = aj[hostid][2]; 00356 jjbuf[bufno][i][0] = jj[hostid][0]; 00357 jjbuf[bufno][i][1] = jj[hostid][1]; 00358 jjbuf[bufno][i][2] = jj[hostid][2]; 00359 tjbuf[bufno][i] = tj[hostid]; 00360 mjbuf[bufno][i] = mj[hostid]; 00361 indexbuf[bufno][i] = hostid; 00362 i++; 00363 } 00364 } 00365 } 00366 void h3mjpdma_start_( buff_id ) 00367 int *buff_id; 00368 00369 { 00370 register int i; 00371 register int k; 00372 register int j; 00373 register int buff; 00374 int _Kii2; 00375 int _Kii1; 00376 00377 if (debug_level > 0) { 00378 fprintf( (_iob + 2), "(h3mjpdma_start) called %d \n", (buff_id[0]) ); 00379 } 00380 buff = buff_id[0]; 00381 for ( i = 0; i<njbuf[buff]; i++ ) { 00382 _Kii1 = indexbuf[buff][i]; 00383 if (debug_level > 2) { 00384 printf( "jpdma_start %d %d %d %f\n", i, _Kii1, buff, xjbuf[buff][i][0] ); 00385 } 00386 xjmem[_Kii1][0] = xjbuf[buff][i][0]; 00387 xjmem[_Kii1][1] = xjbuf[buff][i][1]; 00388 xjmem[_Kii1][2] = xjbuf[buff][i][2]; 00389 vjmem[_Kii1][0] = vjbuf[buff][i][0]; 00390 vjmem[_Kii1][1] = vjbuf[buff][i][1]; 00391 vjmem[_Kii1][2] = vjbuf[buff][i][2]; 00392 ajmem[_Kii1][0] = ajbuf[buff][i][0]; 00393 ajmem[_Kii1][1] = ajbuf[buff][i][1]; 00394 ajmem[_Kii1][2] = ajbuf[buff][i][2]; 00395 jjmem[_Kii1][0] = jjbuf[buff][i][0]; 00396 jjmem[_Kii1][1] = jjbuf[buff][i][1]; 00397 jjmem[_Kii1][2] = jjbuf[buff][i][2]; 00398 tjmem[_Kii1] = tjbuf[buff][i]; 00399 mjmem[_Kii1] = mjbuf[buff][i]; 00400 } 00401 } 00402 void h3jpdma_flush_( ) 00403 00404 { 00405 int i; 00406 00407 i = 0; 00408 while ( i < buff_used ) { 00409 h3mjpdma_start_( &i ); 00410 i++; 00411 } 00412 buff_used = 0; 00413 } 00414 void h3jpdma_reset_( ) 00415 00416 { 00417 00418 buff_used = 0; 00419 } 00420 static int njset; 00421 int h3calc_firsthalf_( nj, ni, xi, vi, eps2, h2 ) 00422 int *nj; 00423 int *ni; 00424 double (*xi)[3]; 00425 double (*vi)[3]; 00426 double *eps2; 00427 double *h2; 00428 00429 { 00430 int i; 00431 int j; 00432 int k; 00433 double s; 00434 double s1; 00435 double s2; 00436 long _Kii1; 00437 long _Kii2; 00438 00439 njset = nj[0]; 00440 if (ni[0] > 3) { 00441 fprintf( (_iob + 2), "(h3ipdma) Too large ni (%d > %d\n", ni, 3 ); 00442 exit( ((-1)) ); 00443 } 00444 i = 0; 00445 _Kii1 = (void *)(ximem[i] + 2) < (void *)(xi[i]) || (void *)(ximem[i]) > (void *)(xi[i] + 2); 00446 _Kii2 = (void *)(vimem[i] + 2) < (void *)(vi[i]) || (void *)(vimem[i]) > (void *)(vi[i] + 2); 00447 if (!_Kii1) { 00448 if (!_Kii2) { 00449 while ( i < ni[0] ) { 00450 ximem[i][0] = xi[i][0]; 00451 ximem[i][1] = xi[i][1]; 00452 ximem[i][2] = xi[i][2]; 00453 vimem[i][0] = vi[i][0]; 00454 vimem[i][1] = vi[i][1]; 00455 vimem[i][2] = vi[i][2]; 00456 hmem[i] = h2[i] * 2; 00457 epsmem[i] = eps2[i] * 2; 00458 i++; 00459 } 00460 } else { 00461 while ( i < ni[0] ) { 00462 ximem[i][0] = xi[i][0]; 00463 ximem[i][1] = xi[i][1]; 00464 ximem[i][2] = xi[i][2]; 00465 vimem[i][0] = vi[i][0]; 00466 vimem[i][1] = vi[i][1]; 00467 vimem[i][2] = vi[i][2]; 00468 hmem[i] = h2[i] * 2; 00469 epsmem[i] = eps2[i] * 2; 00470 i++; 00471 } 00472 } 00473 } else { 00474 if (!_Kii2) { 00475 while ( i < ni[0] ) { 00476 ximem[i][0] = xi[i][0]; 00477 ximem[i][1] = xi[i][1]; 00478 ximem[i][2] = xi[i][2]; 00479 vimem[i][0] = vi[i][0]; 00480 vimem[i][1] = vi[i][1]; 00481 vimem[i][2] = vi[i][2]; 00482 hmem[i] = h2[i] * 2; 00483 epsmem[i] = eps2[i] * 2; 00484 i++; 00485 } 00486 } else { 00487 while ( i < ni[0] ) { 00488 ximem[i][0] = xi[i][0]; 00489 ximem[i][1] = xi[i][1]; 00490 ximem[i][2] = xi[i][2]; 00491 vimem[i][0] = vi[i][0]; 00492 vimem[i][1] = vi[i][1]; 00493 vimem[i][2] = vi[i][2]; 00494 hmem[i] = h2[i] * 2; 00495 epsmem[i] = eps2[i] * 2; 00496 i++; 00497 } 00498 } 00499 } 00500 if (debug_level > 0) { 00501 i = 0; 00502 while ( i < ni[0] ) { 00503 if (hmem[i] != hmem[i+1] != 0) { 00504 fprintf( (_iob + 2), "h3calc_firsthalf, eps/h2 error for %d\n", i ); 00505 } 00506 i += 2; 00507 } 00508 } 00509 j = 0; 00510 while ( j < nj[0] ) { 00511 s = timem - tjmem[j]; 00512 s1 = 1.5 * s; 00513 s2 = s * 2.e0; 00514 for ( k = 0; k<=2; k++ ) { 00515 xjpred[j][k] = xjmem[j][k] + (vjmem[j][k] + (ajmem[j][k] + jjmem[j][k] * s) * s) * s; 00516 vjpred[j][k] = vjmem[j][k] + (ajmem[j][k] + jjmem[j][k] * s1) * s2; 00517 if (debug_level > 2) { 00518 printf( "predict %d %d %22.14g %22.14g\n", j, k, xjpred[j][k], vjpred[j][k] ); 00519 } 00520 } 00521 j++; 00522 } 00523 } 00524 int calculate_force_on_one_particle( i, acc, jerk, pot ) 00525 int i; 00526 double (*acc)[3]; 00527 double (*jerk)[3]; 00528 double *pot; 00529 00530 { 00531 register int j; 00532 register int k; 00533 double sqrt( ); 00534 register double xi; 00535 register double yi; 00536 register double zi; 00537 register double vxi; 00538 register double vyi; 00539 register double vzi; 00540 register double dx; 00541 register double dy; 00542 register double dz; 00543 register double dvx; 00544 register double dvy; 00545 register double dvz; 00546 register double dr2; 00547 register double drdv; 00548 register double dr2i; 00549 register double dr3i; 00550 register double ax; 00551 register double ay; 00552 register double az; 00553 register double jx; 00554 register double jy; 00555 register double jz; 00556 register double epsi; 00557 00558 jz = 0.e0; 00559 jy = 0.e0; 00560 jx = 0.e0; 00561 az = 0.e0; 00562 ay = 0.e0; 00563 ax = 0.e0; 00564 nnb[i] = 0; 00565 pot[i] = 0.e0; 00566 xi = ximem[i][0]; 00567 yi = ximem[i][1]; 00568 zi = ximem[i][2]; 00569 vxi = vimem[i][0]; 00570 vyi = vimem[i][1]; 00571 vzi = vimem[i][2]; 00572 epsi = epsmem[i]; 00573 j = 0; 00574 while ( j < njset ) { 00575 dx = xjpred[j][0] - xi; 00576 dy = xjpred[j][1] - yi; 00577 dz = xjpred[j][2] - zi; 00578 dvx = vjpred[j][0] - vxi; 00579 dvy = vjpred[j][1] - vyi; 00580 dvz = vjpred[j][2] - vzi; 00581 dr2 = epsi + dx * dx + dy * dy + dz * dz; 00582 drdv = dx * dvx + dy * dvy + dz * dvz; 00583 if (dr2 < hmem[i]) { 00584 nb[i][nnb[i]] = j + 1; 00585 nnb[i]++; 00586 } 00587 if (dr2 > 0.e0) { 00588 dr2i = 1.e0 / dr2; 00589 dr3i = mjmem[j] * dr2i * sqrt( dr2i ); 00590 drdv *= 3.e0 * dr2i; 00591 ax += dx * dr3i; 00592 ay += dy * dr3i; 00593 az += dz * dr3i; 00594 jx += (dvx - dx * drdv) * dr3i; 00595 jy += (dvy - dy * drdv) * dr3i; 00596 jz += (dvz - dz * drdv) * dr3i; 00597 } 00598 j++; 00599 } 00600 acc[i][0] = ax; 00601 acc[i][1] = ay; 00602 acc[i][2] = az; 00603 jerk[i][0] = jx; 00604 jerk[i][1] = jy; 00605 jerk[i][2] = jz; 00606 } 00607 int h3calc_lasthalf_( ni, acc, jerk, pot ) 00608 int *ni; 00609 double (*acc)[3]; 00610 double (*jerk)[3]; 00611 double *pot; 00612 00613 { 00614 register int i; 00615 register int j; 00616 register int k; 00617 int _Kii1; 00618 00619 if (ni[0] > 3) { 00620 fprintf( (_iob + 2), "(h3ipdma) Too large ni (%d > %d\n", ni, 3 ); 00621 exit( ((-1)) ); 00622 } 00623 if (debug_level) { 00624 fprintf( (_iob + 2), "lasthalf ni=%d\n", (ni[0]) ); 00625 } 00626 for ( _Kii1 = 0; _Kii1<ni[0]; _Kii1++ ) { 00627 calculate_force_on_one_particle( _Kii1, acc, jerk, pot ); 00628 } 00629 } 00630 int h3calc_lasthalf_old( ni, acc, jerk, pot ) 00631 int *ni; 00632 double (*acc)[3]; 00633 double (*jerk)[3]; 00634 double *pot; 00635 00636 { 00637 register int i; 00638 register int j; 00639 register int k; 00640 double sqrt( ); 00641 register double dx[3]; 00642 register double dv[3]; 00643 register double dr2; 00644 register double drdv; 00645 register double dr2i; 00646 register double dr3i; 00647 long _Kii1; 00648 int _Kii2; 00649 00650 if (ni[0] > 3) { 00651 fprintf( (_iob + 2), "(h3ipdma) Too large ni (%d > %d\n", ni, 3 ); 00652 exit( ((-1)) ); 00653 } 00654 if (debug_level) { 00655 fprintf( (_iob + 2), "lasthalf ni=%d\n", (ni[0]) ); 00656 } 00657 i = 0; 00658 _Kii1 = (void *)(acc[i] + 2) < (void *)(jerk[i]) || (void *)(acc[i]) > (void *)(jerk[i] + 2); 00659 _Kii2 = !_Kii1; 00660 while ( i < ni[0] ) { 00661 if (_Kii2) { 00662 acc[i][0] = 0.e0; 00663 acc[i][1] = 0.e0; 00664 acc[i][2] = 0.e0; 00665 jerk[i][0] = 0.e0; 00666 jerk[i][1] = 0.e0; 00667 jerk[i][2] = 0.e0; 00668 } else { 00669 acc[i][0] = 0.e0; 00670 acc[i][1] = 0.e0; 00671 acc[i][2] = 0.e0; 00672 jerk[i][0] = 0.e0; 00673 jerk[i][1] = 0.e0; 00674 jerk[i][2] = 0.e0; 00675 } 00676 nnb[i] = 0; 00677 pot[i] = 0.e0; 00678 j = 0; 00679 while ( j < njset ) { 00680 dr2 = epsmem[i]; 00681 drdv = 0.e0; 00682 for ( k = 0; k<=2; k++ ) { 00683 dx[k] = xjpred[j][k] - ximem[i][k]; 00684 dv[k] = vjpred[j][k] - vimem[i][k]; 00685 dr2 += dx[k] * dx[k]; 00686 drdv += dx[k] * dv[k]; 00687 if (debug_level > 2) { 00688 fprintf( (_iob + 2), "rijk %d %d %d %g %21.14g %21.14g\n", i, j, k, dx[k], xjpred[j][k], ximem[i][k] ); 00689 } 00690 } 00691 if (dr2 < hmem[i]) { 00692 nb[i][nnb[i]] = j + 1; 00693 nnb[i]++; 00694 } 00695 if (debug_level > 1) { 00696 fprintf( (_iob + 2), "i, j, nnb[i], dr2, h = %d %d %d %g %g\n", i, j, nnb[i], dr2, hmem[i] ); 00697 } 00698 if (dr2 > 0.e0) { 00699 dr2i = 1.e0 / dr2; 00700 dr3i = mjmem[j] * dr2i * sqrt( dr2i ); 00701 drdv *= 3.e0 * dr2i; 00702 for ( k = 0; k<=2; k++ ) { 00703 acc[i][k] += dx[k] * dr3i; 00704 jerk[i][k] += (dv[k] - dx[k] * drdv) * dr3i; 00705 if (debug_level > 1) { 00706 fprintf( (_iob + 2), "force i,j,k %d %d %d %20.10g \n", i, j, k, acc[i][k] ); 00707 } 00708 } 00709 } else { 00710 if (debug_level > 1) { 00711 fprintf( (_iob + 2), "force skip i,j %d %d \n", i, j ); 00712 } 00713 } 00714 j++; 00715 } 00716 i++; 00717 } 00718 } 00719 int h3calc_( nj, ni, xi, vi, eps2, h2, acc, jerk, pot ) 00720 int *nj; 00721 int *ni; 00722 double (*xi)[3]; 00723 double (*vi)[3]; 00724 double *eps2; 00725 double *h2; 00726 double (*acc)[3]; 00727 double (*jerk)[3]; 00728 double *pot; 00729 00730 { 00731 00732 h3calc_firsthalf_( nj, ni, xi, vi, eps2, h2 ); 00733 h3calc_lasthalf_( ni, acc, jerk, pot ); 00734 } 00735 void h3nbread_( nboards ) 00736 int *nboards; 00737 00738 { 00739 00740 } 00741 void set_debug_level_( int *level ) 00742 { 00743 00744 debug_level = level[0]; 00745 } 00746 void h3setdebuglevel_( int *level ) 00747 { 00748 00749 set_debug_level_( level ); 00750 } 00751 int compare( i, j ) 00752 int *i; 00753 int *j; 00754 00755 { 00756 00757 return i[0] - j[0]; 00758 } 00759 int h3nblist_( board, chip, nblist ) 00760 int *board; 00761 int *chip; 00762 int *nblist; 00763 00764 { 00765 int i; 00766 00767 i = 0; 00768 while ( i < nnb[chip[0]] ) { 00769 nblist[i] = nb[chip[0]][i]; 00770 i++; 00771 } 00772 return nnb[chip[0]]; 00773 }