Révision 225 TrouNoir/TrouNoir.py

TrouNoir.py (revision 225)
532 532
 
533 533
}
534 534

  
535
__kernel void Original(__global float *zImage,__global float *fImage,
536
                       float Mass,float InternalRadius,
537
                       float ExternalRadius,float Angle,
538
                       int Line)
535
__kernel void EachCircle(__global float *zImage,__global float *fImage,
536
                         float Mass,float InternalRadius,
537
                         float ExternalRadius,float Angle,
538
                         int Line)
539 539
{
540 540
  // Integer Impact Parameter ID 
541 541
  int bi=get_global_id(0);
542 542
  // Integer Impact Parameter Size (half of image)
543 543
  int bmaxi=get_global_size(0);
544 544

  
545
  float Trajectories[2048];
545
  float Trajectory[TRACKPOINTS];
546 546

  
547
  // Perform trajectory for each pixel
548

  
549 547
  float m,rs,ri,re,tho;
550 548
  int raie,q;
551 549

  
......
583 581
  // b versus us
584 582
  float bvus=fabs(b/us);
585 583
  float bvus0=bvus;
586
  Trajectories[nh]=bvus;
584
  Trajectory[nh]=bvus;
587 585

  
588 586
  do
589 587
  {
......
593 591
     vp=vs;
594 592
     rungekutta(&ps,&us,&vs,pp,up,vp,h,m,b);
595 593
     bvus=fabs(b/us);
596
     Trajectories[nh]=bvus;
594
     Trajectory[nh]=bvus;
597 595

  
598 596
  } while ((bvus>=rs)&&(bvus<=bvus0));
599 597

  
598
  for (uint i=(uint)nh+1;i<TRACKPOINTS;i++) {
599
     Trajectory[i]=0.e0f;
600
  }
601

  
600 602
  int imx=(int)(16*bi);
601 603

  
602 604
  for (int i=0;i<imx;i++)
603 605
  {
604
     float zp=0,fp=0;
606
     float zp=0.,fp=0.;
605 607
     float phi=2.*PI/(float)imx*(float)i;
606 608
     float phd=atanp(cos(phi)*sin(tho),cos(tho));
607 609
     uint yi=(uint)((float)bi*sin(phi)+bmaxi);
......
618 620

  
619 621
        if (ni<nh)
620 622
        {
621
           r=(Trajectories[ni+1]-Trajectories[ni])*(nr-ni*1.)+Trajectories[ni];
623
           r=(Trajectory[ni+1]-Trajectory[ni])*(nr-ni*1.)+Trajectory[ni];
622 624
        }
623 625
        else
624 626
        {
625
           r=Trajectories[ni];
627
           r=Trajectory[ni];
626 628
        }
627 629
	   
628 630
        if ((r<=re)&&(r>=ri))
......
643 645
  barrier(CLK_GLOBAL_MEM_FENCE);
644 646
 
645 647
}
648

  
649
__kernel void Original(__global float *zImage,__global float *fImage,
650
                       uint Size,float Mass,float InternalRadius,
651
                       float ExternalRadius,float Angle,
652
                       int Line)
653
{
654
   // Integer Impact Parameter Size (half of image)
655
   uint bmaxi=(uint)Size;
656

  
657
   float Trajectory[TRACKPOINTS];
658

  
659
   // Perform trajectory for each pixel
660

  
661
   float m,rs,ri,re,tho;
662
   int raie,q;
663

  
664
   m=Mass;
665
   rs=2.*m;
666
   ri=InternalRadius;
667
   re=ExternalRadius;
668
   tho=Angle;
669
   q=-2;
670
   raie=Line;
671

  
672
   float bmx,db,b,h;
673
   int nh;
674

  
675
   // Autosize for image
676
   bmx=1.25e0f*re;
677

  
678
   // Angular step of integration
679
   h=4.e0f*PI/(float)TRACKPOINTS;
680

  
681
   // Integer Impact Parameter ID 
682
   for (int bi=0;bi<bmaxi;bi++)
683
   {
684
      // impact parameter
685
      b=(float)bi/(float)bmaxi*bmx;
686
      db=bmx/(2.e0f*(float)bmaxi);
687

  
688
      float up,vp,pp,us,vs,ps;
689

  
690
      up=0.;
691
      vp=1.;
692
      
693
      pp=0.;
694
      nh=0;
695

  
696
      rungekutta(&ps,&us,&vs,pp,up,vp,h,m,b);
697
  
698
      // b versus us
699
      float bvus=fabs(b/us);
700
      float bvus0=bvus;
701
      Trajectory[nh]=bvus;
702

  
703
      do
704
      {
705
         nh++;
706
         pp=ps;
707
         up=us;
708
         vp=vs;
709
         rungekutta(&ps,&us,&vs,pp,up,vp,h,m,b);
710
         bvus=fabs(b/us);
711
         Trajectory[nh]=bvus;
712

  
713
      } while ((bvus>=rs)&&(bvus<=bvus0));
714

  
715
      for (uint i=(uint)nh+1;i<TRACKPOINTS;i++) {
716
         Trajectory[i]=0.e0f;
717
      }
718

  
719
      int imx=(int)(16*bi);
720

  
721
      for (int i=0;i<imx;i++)
722
      {
723
         float zp=0,fp=0;
724
         float phi=2.e0f*PI/(float)imx*(float)i;
725
         float phd=atanp(cos(phi)*sin(tho),cos(tho));
726
         uint yi=(uint)((float)bi*sin(phi)+bmaxi);
727
         uint xi=(uint)((float)bi*cos(phi)+bmaxi);
728

  
729
         int HalfLap=0,ExitOnImpact=0,ni;
730
         float php,nr,r;
731

  
732
         do
733
         {
734
            php=phd+(float)HalfLap*PI;
735
            nr=php/h;
736
            ni=(int)nr;
737

  
738
            if (ni<nh)
739
            {
740
               r=(Trajectory[ni+1]-Trajectory[ni])*(nr-ni*1.)+Trajectory[ni];
741
            }
742
            else
743
            {
744
               r=Trajectory[ni];
745
            }
746
	   
747
            if ((r<=re)&&(r>=ri))
748
            {
749
               ExitOnImpact=1;
750
               impact(phi,r,b,tho,m,&zp,&fp,q,db,h,raie);
751
            }
752
 	      
753
            HalfLap++;
754
 
755
         } while ((HalfLap<=2)&&(ExitOnImpact==0));
756
  
757
         zImage[yi+2*bmaxi*xi]=zp;
758
         fImage[yi+2*bmaxi*xi]=fp;
759
  
760
      }
761

  
762
   } 
763
   
764
   barrier(CLK_GLOBAL_MEM_FENCE);
765
 
766
}
646 767
"""
647 768

  
648 769
def KernelCodeCuda():
......
1145 1266

  
1146 1267
}
1147 1268

  
1148
__global__ void Original(float *zImage,float *fImage,
1149
                         float Mass,float InternalRadius,
1150
                         float ExternalRadius,float Angle,
1151
                         int Line)
1269
__global__ void EachCircle(float *zImage,float *fImage,
1270
                           float Mass,float InternalRadius,
1271
                           float ExternalRadius,float Angle,
1272
                           int Line)
1152 1273
{
1153 1274
  // Integer Impact Parameter ID 
1154 1275
  int bi=blockIdx.x*blockDim.x+threadIdx.x;
......
1156 1277
  // Integer Impact Parameter Size (half of image)
1157 1278
  int bmaxi=gridDim.x*blockDim.x;
1158 1279

  
1159
  float Trajectories[2048];
1280
  float Trajectory[2048];
1160 1281

  
1161 1282
  // Perform trajectory for each pixel
1162 1283

  
......
1197 1318
  // b versus us
1198 1319
  float bvus=fabs(b/us);
1199 1320
  float bvus0=bvus;
1200
  Trajectories[nh]=bvus;
1321
  Trajectory[nh]=bvus;
1201 1322

  
1202 1323
  do
1203 1324
  {
......
1207 1328
     vp=vs;
1208 1329
     rungekutta(&ps,&us,&vs,pp,up,vp,h,m,b);
1209 1330
     bvus=fabs(b/us);
1210
     Trajectories[nh]=bvus;
1331
     Trajectory[nh]=bvus;
1211 1332

  
1212 1333
  } while ((bvus>=rs)&&(bvus<=bvus0));
1213 1334

  
......
1232 1353

  
1233 1354
        if (ni<nh)
1234 1355
        {
1235
           r=(Trajectories[ni+1]-Trajectories[ni])*(nr-ni*1.)+Trajectories[ni];
1356
           r=(Trajectory[ni+1]-Trajectory[ni])*(nr-ni*1.)+Trajectory[ni];
1236 1357
        }
1237 1358
        else
1238 1359
        {
1239
           r=Trajectories[ni];
1360
           r=Trajectory[ni];
1240 1361
        }
1241 1362
	   
1242 1363
        if ((r<=re)&&(r>=ri))
......
1257 1378
  }
1258 1379
 
1259 1380
}
1381

  
1382
__global__ void Original(float *zImage,float *fImage,
1383
                         uint Size,float Mass,float InternalRadius,
1384
                         float ExternalRadius,float Angle,
1385
                         int Line)
1386
{
1387
   // Integer Impact Parameter Size (half of image)
1388
   uint bmaxi=(uint)Size;
1389

  
1390
   float Trajectory[TRACKPOINTS];
1391

  
1392
   // Perform trajectory for each pixel
1393

  
1394
   float m,rs,ri,re,tho;
1395
   int raie,q;
1396

  
1397
   m=Mass;
1398
   rs=2.*m;
1399
   ri=InternalRadius;
1400
   re=ExternalRadius;
1401
   tho=Angle;
1402
   q=-2;
1403
   raie=Line;
1404

  
1405
   float bmx,db,b,h;
1406
   int nh;
1407

  
1408
   // Autosize for image
1409
   bmx=1.25e0f*re;
1410

  
1411
   // Angular step of integration
1412
   h=4.e0f*PI/(float)TRACKPOINTS;
1413

  
1414
   // Integer Impact Parameter ID 
1415
   for (int bi=0;bi<bmaxi;bi++)
1416
   {
1417
      // impact parameter
1418
      b=(float)bi/(float)bmaxi*bmx;
1419
      db=bmx/(2.e0f*(float)bmaxi);
1420

  
1421
      float up,vp,pp,us,vs,ps;
1422

  
1423
      up=0.;
1424
      vp=1.;
1425
      
1426
      pp=0.;
1427
      nh=0;
1428

  
1429
      rungekutta(&ps,&us,&vs,pp,up,vp,h,m,b);
1430
  
1431
      // b versus us
1432
      float bvus=fabs(b/us);
1433
      float bvus0=bvus;
1434
      Trajectory[nh]=bvus;
1435

  
1436
      do
1437
      {
1438
         nh++;
1439
         pp=ps;
1440
         up=us;
1441
         vp=vs;
1442
         rungekutta(&ps,&us,&vs,pp,up,vp,h,m,b);
1443
         bvus=fabs(b/us);
1444
         Trajectory[nh]=bvus;
1445

  
1446
      } while ((bvus>=rs)&&(bvus<=bvus0));
1447

  
1448
      for (uint i=(uint)nh+1;i<TRACKPOINTS;i++) {
1449
         Trajectory[i]=0.e0f;
1450
      }
1451

  
1452
      int imx=(int)(16*bi);
1453

  
1454
      for (int i=0;i<imx;i++)
1455
      {
1456
         float zp=0,fp=0;
1457
         float phi=2.e0f*PI/(float)imx*(float)i;
1458
         float phd=atanp(cos(phi)*sin(tho),cos(tho));
1459
         uint yi=(uint)((float)bi*sin(phi)+bmaxi);
1460
         uint xi=(uint)((float)bi*cos(phi)+bmaxi);
1461

  
1462
         int HalfLap=0,ExitOnImpact=0,ni;
1463
         float php,nr,r;
1464

  
1465
         do
1466
         {
1467
            php=phd+(float)HalfLap*PI;
1468
            nr=php/h;
1469
            ni=(int)nr;
1470

  
1471
            if (ni<nh)
1472
            {
1473
               r=(Trajectory[ni+1]-Trajectory[ni])*(nr-ni*1.)+Trajectory[ni];
1474
            }
1475
            else
1476
            {
1477
               r=Trajectory[ni];
1478
            }
1479
	   
1480
            if ((r<=re)&&(r>=ri))
1481
            {
1482
               ExitOnImpact=1;
1483
               impact(phi,r,b,tho,m,&zp,&fp,q,db,h,raie);
1484
            }
1485
 	      
1486
            HalfLap++;
1487
 
1488
         } while ((HalfLap<=2)&&(ExitOnImpact==0));
1489
  
1490
         zImage[yi+2*bmaxi*xi]=zp;
1491
         fImage[yi+2*bmaxi*xi]=fp;
1492
  
1493
      }
1494

  
1495
   } 
1496
   
1497
}
1260 1498
"""
1261 1499
    return(BlobCUDA)
1262 1500
    
......
1356 1594
                                       numpy.int32(Line))
1357 1595
        CLLaunch.wait()
1358 1596
    elif Method=='Original':
1359
        CLLaunch=BlackHoleCL.Original(queue,(zImage.shape[0]/2,),
1597
        CLLaunch=BlackHoleCL.Original(queue,(1,),
1360 1598
                                      None,zImageCL,fImageCL,
1599
                                      numpy.uint32(zImage.shape[0]/2),
1361 1600
                                      numpy.float32(Mass),
1362 1601
                                      numpy.float32(InternalRadius),
1363 1602
                                      numpy.float32(ExternalRadius),
1364 1603
                                      numpy.float32(Angle),
1365 1604
                                      numpy.int32(Line))
1366 1605
        CLLaunch.wait()
1606
    elif Method=='EachCircle':
1607
        CLLaunch=BlackHoleCL.EachCircle(queue,(zImage.shape[0]/2,),
1608
                                        None,zImageCL,fImageCL,
1609
                                        numpy.float32(Mass),
1610
                                        numpy.float32(InternalRadius),
1611
                                        numpy.float32(ExternalRadius),
1612
                                        numpy.float32(Angle),
1613
                                        numpy.int32(Line))
1614
        CLLaunch.wait()
1367 1615
    elif Method=='TrajectoCircle':
1368 1616
        CLLaunch=BlackHoleCL.Trajectory(queue,(Trajectories.shape[0],),
1369 1617
                                        None,TrajectoriesCL,IdLastCL,
......
1480 1728

  
1481 1729
    EachPixelCU=mod.get_function("EachPixel")
1482 1730
    OriginalCU=mod.get_function("Original")
1731
    EachCircleCU=mod.get_function("EachCircle")
1483 1732
    TrajectoryCU=mod.get_function("Trajectory")
1484 1733
    PixelCU=mod.get_function("Pixel")
1485 1734
    CircleCU=mod.get_function("Circle")
......
1504 1753
                    numpy.int32(Line),
1505 1754
                    grid=(zImage.shape[0]/32,zImage.shape[1]/32),
1506 1755
                    block=(32,32,1))
1756
    elif Method=='EachCircle':
1757
        EachCircleCU(zImageCU,fImageCU,
1758
                   numpy.float32(Mass),
1759
                   numpy.float32(InternalRadius),
1760
                   numpy.float32(ExternalRadius),
1761
                   numpy.float32(Angle),
1762
                   numpy.int32(Line),
1763
                   grid=(zImage.shape[0]/32/2,1),
1764
                   block=(32,1,1))
1507 1765
    elif Method=='Original':
1508 1766
        OriginalCU(zImageCU,fImageCU,
1767
                   numpy.uint32(zImage.shape[0]/2),
1509 1768
                   numpy.float32(Mass),
1510 1769
                   numpy.float32(InternalRadius),
1511 1770
                   numpy.float32(ExternalRadius),
1512 1771
                   numpy.float32(Angle),
1513 1772
                   numpy.int32(Line),
1514
                   grid=(zImage.shape[0]/32/2,1),
1515
                   block=(32,1,1))
1773
                   grid=(1,1),
1774
                   block=(1,1,1))
1516 1775
    elif Method=='TrajectoCircle':
1517 1776
        TrajectoryCU(TrajectoriesCU,IdLastCU,
1518 1777
                     numpy.float32(Mass),
......
1601 1860
    # No output as image
1602 1861
    NoImage = False
1603 1862
    
1604
    HowToUse='%s -h [Help] -b [BlackBodyEmission] -n [NoImage] -p <Einstein/Newton> -s <SizeInPixels> -m <Mass> -i <DiscInternalRadius> -x <DiscExternalRadius> -a <AngleAboveDisc> -d <DeviceId> -c <Greyscale/Red2Yellow> -g <CUDA/OpenCL> -t <EachPixel/TrajectoCircle/TrajectoPixel/Original> -v <FP32/FP64>'
1863
    HowToUse='%s -h [Help] -b [BlackBodyEmission] -n [NoImage] -p <Einstein/Newton> -s <SizeInPixels> -m <Mass> -i <DiscInternalRadius> -x <DiscExternalRadius> -a <AngleAboveDisc> -d <DeviceId> -c <Greyscale/Red2Yellow> -g <CUDA/OpenCL> -t <EachPixel/TrajectoCircle/TrajectoPixel/EachCircle/Original> -v <FP32/FP64>'
1605 1864

  
1606 1865
    try:
1607 1866
        opts, args = getopt.getopt(sys.argv[1:],"hbns:m:i:x:a:d:g:v:t:c:p:",["blackbody","noimage","camera","size=","mass=","internal=","external=","angle=","device=","gpustyle=","variabletype=","method=","colors=","physics="])

Formats disponibles : Unified diff