Changeset df776db in sasmodels for sasmodels/generate.py
- Timestamp:
- Jul 27, 2016 3:56:54 PM (8 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- 739aad4
- Parents:
- 8357f66 (diff), 63c6a08 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/generate.py
r562506e rdf776db 387 387 388 388 389 def kernel_name(model_info, is_2d):390 # type: (ModelInfo, bool) -> str389 def kernel_name(model_info, variant): 390 # type: (ModelInfo, str) -> str 391 391 """ 392 392 Name of the exported kernel symbol. 393 """ 394 return model_info.name + "_" + ("Iqxy" if is_2d else "Iq") 393 394 *variant* is "Iq", "Iqxy" or "Imagnetic". 395 """ 396 return model_info.name + "_" + variant 395 397 396 398 … … 485 487 source.append(code) 486 488 487 488 489 def make_source(model_info): 489 # type: (ModelInfo) -> str490 # type: (ModelInfo) -> Dict[str, str] 490 491 """ 491 492 Generate the OpenCL/ctypes kernel from the module info. … … 539 540 540 541 # Define the parameter table 542 # TODO: plug in current line number 543 source.append('#line 542 "sasmodels/generate.py"') 541 544 source.append("#define PARAMETER_TABLE \\") 542 545 source.append("\\\n".join(p.as_definition() … … 556 559 refs = ["_q[_i]"] + _call_pars("_v.", partable.iq_parameters) 557 560 call_iq = "#define CALL_IQ(_q,_i,_v) Iq(%s)" % (",".join(refs)) 558 if _have_Iqxy(user_code) :561 if _have_Iqxy(user_code) or isinstance(model_info.Iqxy, str): 559 562 # Call 2D model 560 refs = [" q[2*_i]", "q[2*_i+1]"] + _call_pars("_v.", partable.iqxy_parameters)563 refs = ["_q[2*_i]", "_q[2*_i+1]"] + _call_pars("_v.", partable.iqxy_parameters) 561 564 call_iqxy = "#define CALL_IQ(_q,_i,_v) Iqxy(%s)" % (",".join(refs)) 562 565 else: 563 566 # Call 1D model with sqrt(qx^2 + qy^2) 564 warnings.warn("Creating Iqxy = Iq(sqrt(qx^2 + qy^2))")567 #warnings.warn("Creating Iqxy = Iq(sqrt(qx^2 + qy^2))") 565 568 # still defined:: refs = ["q[i]"] + _call_pars("v", iq_parameters) 566 569 pars_sqrt = ["sqrt(_q[2*_i]*_q[2*_i]+_q[2*_i+1]*_q[2*_i+1])"] + refs[1:] 567 570 call_iqxy = "#define CALL_IQ(_q,_i,_v) Iq(%s)" % (",".join(pars_sqrt)) 568 571 572 magpars = [k-2 for k,p in enumerate(partable.call_parameters) 573 if p.type == 'sld'] 574 569 575 # Fill in definitions for numbers of parameters 570 576 source.append("#define MAX_PD %s"%partable.max_pd) 571 source.append("#define NPARS %d"%partable.npars) 577 source.append("#define NUM_PARS %d"%partable.npars) 578 source.append("#define NUM_VALUES %d" % partable.nvalues) 579 source.append("#define NUM_MAGNETIC %d" % partable.nmagnetic) 580 source.append("#define MAGNETIC_PARS %s"%",".join(str(k) for k in magpars)) 581 for k,v in enumerate(magpars[:3]): 582 source.append("#define MAGNETIC_PAR%d %d"%(k+1, v)) 572 583 573 584 # TODO: allow mixed python/opencl kernels? 574 585 575 source.append("#if defined(USE_OPENCL)") 576 source.extend(_add_kernels(ocl_code[0], call_iq, call_iqxy, model_info.name)) 577 source.append("#else /* !USE_OPENCL */") 578 source.extend(_add_kernels(dll_code[0], call_iq, call_iqxy, model_info.name)) 579 source.append("#endif /* !USE_OPENCL */") 580 return '\n'.join(source) 581 582 583 def _add_kernels(kernel_code, call_iq, call_iqxy, name): 584 # type: (str, str, str, str) -> List[str] 585 source = [ 586 ocl = kernels(ocl_code, call_iq, call_iqxy, model_info.name) 587 dll = kernels(dll_code, call_iq, call_iqxy, model_info.name) 588 result = { 589 'dll': '\n'.join(source+dll[0]+dll[1]+dll[2]), 590 'opencl': '\n'.join(source+ocl[0]+ocl[1]+ocl[2]), 591 } 592 593 return result 594 595 596 def kernels(kernel, call_iq, call_iqxy, name): 597 # type: ([str,str], str, str, str) -> List[str] 598 code = kernel[0] 599 path = kernel[1].replace('\\', '\\\\') 600 iq = [ 586 601 # define the Iq kernel 587 "#define KERNEL_NAME %s_Iq" %name,602 "#define KERNEL_NAME %s_Iq" % name, 588 603 call_iq, 589 kernel_code, 604 '#line 1 "%s Iq"' % path, 605 code, 590 606 "#undef CALL_IQ", 591 607 "#undef KERNEL_NAME", 592 608 ] 609 610 iqxy = [ 593 611 # define the Iqxy kernel from the same source with different #defines 594 "#define KERNEL_NAME %s_Iqxy" %name,612 "#define KERNEL_NAME %s_Iqxy" % name, 595 613 call_iqxy, 596 kernel_code, 614 '#line 1 "%s Iqxy"' % path, 615 code, 616 "#undef CALL_IQ", 617 "#undef KERNEL_NAME", 618 ] 619 620 imagnetic = [ 621 # define the Imagnetic kernel 622 "#define KERNEL_NAME %s_Imagnetic" % name, 623 "#define MAGNETIC 1", 624 call_iqxy, 625 '#line 1 "%s Imagnetic"' % path, 626 code, 627 "#undef MAGNETIC", 597 628 "#undef CALL_IQ", 598 629 "#undef KERNEL_NAME", 599 630 ] 600 return source 631 632 return iq, iqxy, imagnetic 601 633 602 634 … … 712 744 model_info = make_model_info(kernel_module) 713 745 source = make_source(model_info) 714 print(source )746 print(source['dll']) 715 747 716 748
Note: See TracChangeset
for help on using the changeset viewer.