Changeset 01c8d9e in sasmodels for sasmodels/generate.py
- Timestamp:
- Aug 7, 2018 12:32:18 PM (6 years ago)
- Branches:
- master, core_shell_microgels, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- c11d09f
- Parents:
- 707cbdb
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/generate.py
rd86f0fc r01c8d9e 672 672 673 673 # type in IQXY pattern could be single, float, double, long double, ... 674 _IQXY_PATTERN = re.compile(r"(^|\s)double\s+I(?P<mode>q(a b?c|xy))\s*[(]",674 _IQXY_PATTERN = re.compile(r"(^|\s)double\s+I(?P<mode>q(ac|abc|xy))\s*[(]", 675 675 flags=re.MULTILINE) 676 676 def find_xy_mode(source): … … 701 701 return 'qa' 702 702 703 # type in IQXY pattern could be single, float, double, long double, ... 704 _FQ_PATTERN = re.compile(r"(^|\s)void\s+Fq[(]", flags=re.MULTILINE) 705 def has_Fq(source): 706 for code in source: 707 m = _FQ_PATTERN.search(code) 708 if m is not None: 709 return True 710 return False 703 711 704 712 def _add_source(source, code, path, lineno=1): … … 730 738 # dispersion. Need to be careful that necessary parameters are available 731 739 # for computing volume even if we allow non-disperse volume parameters. 732 733 740 partable = model_info.parameters 734 735 741 # Load templates and user code 736 742 kernel_header = load_template('kernel_header.c') 737 743 kernel_code = load_template('kernel_iq.c') 738 744 user_code = [(f, open(f).read()) for f in model_sources(model_info)] 739 740 745 # Build initial sources 741 746 source = [] … … 743 748 for path, code in user_code: 744 749 _add_source(source, code, path) 745 746 750 if model_info.c_code: 747 751 _add_source(source, model_info.c_code, model_info.filename, … … 789 793 source.append("\\\n".join(p.as_definition() 790 794 for p in partable.kernel_parameters)) 791 792 795 # Define the function calls 793 796 if partable.form_volume_parameters: … … 800 803 call_volume = "#define CALL_VOLUME(v) 1.0" 801 804 source.append(call_volume) 802 803 805 model_refs = _call_pars("_v.", partable.iq_parameters) 804 pars = ",".join(["_q"] + model_refs) 805 call_iq = "#define CALL_IQ(_q, _v) Iq(%s)" % pars 806 #create varaible BETA to turn on and off beta approximation 807 BETA = has_Fq(source) 808 if not BETA: 809 pars = ",".join(["_q"] + model_refs) 810 call_iq = "#define CALL_IQ(_q, _v) Iq(%s)" % pars 811 else: 812 pars = ",".join(["_q", "&_F1", "&_F2",] + model_refs) 813 call_iq = "#define CALL_IQ(_q, _F1, _F2, _v) Fq(%s)" % pars 806 814 if xy_mode == 'qabc': 807 815 pars = ",".join(["_qa", "_qb", "_qc"] + model_refs) … … 831 839 magpars = [k-2 for k, p in enumerate(partable.call_parameters) 832 840 if p.type == 'sld'] 833 834 841 # Fill in definitions for numbers of parameters 842 source.append("#define BETA %d" %(1 if BETA else 0)) 835 843 source.append("#define MAX_PD %s"%partable.max_pd) 836 844 source.append("#define NUM_PARS %d"%partable.npars) … … 839 847 source.append("#define MAGNETIC_PARS %s"%",".join(str(k) for k in magpars)) 840 848 source.append("#define PROJECTION %d"%PROJECTION) 841 842 849 # TODO: allow mixed python/opencl kernels? 843 844 850 ocl = _kernels(kernel_code, call_iq, call_iqxy, clear_iqxy, model_info.name) 845 851 dll = _kernels(kernel_code, call_iq, call_iqxy, clear_iqxy, model_info.name) 852 846 853 result = { 847 854 'dll': '\n'.join(source+dll[0]+dll[1]+dll[2]), 848 855 'opencl': '\n'.join(source+ocl[0]+ocl[1]+ocl[2]), 849 856 } 850 857 #print(result['dll']) 851 858 return result 852 859 … … 1068 1075 model_info = make_model_info(kernel_module) 1069 1076 source = make_source(model_info) 1070 print(source['dll'])1077 #print(source['dll']) 1071 1078 1072 1079
Note: See TracChangeset
for help on using the changeset viewer.