cpuColorSpinorField::cpuColorSpinorField(const ColorSpinorField &src) : ColorSpinorField(src), init(false), order_double(NULL), order_single(NULL) { create(QUDA_COPY_FIELD_CREATE); if (src.FieldLocation() == QUDA_CPU_FIELD_LOCATION) { memcpy(v, dynamic_cast<const cpuColorSpinorField&>(src).v, bytes); } else if (src.FieldLocation() == QUDA_CUDA_FIELD_LOCATION) { dynamic_cast<const cudaColorSpinorField&>(src).saveCPUSpinorField(*this); } else { errorQuda("FieldType not supported"); } }
cudaColorSpinorField::cudaColorSpinorField(const ColorSpinorField &src) : ColorSpinorField(src), alloc(false), init(true) { fieldLocation = QUDA_CUDA_FIELD_LOCATION; create(QUDA_COPY_FIELD_CREATE); if (src.FieldLocation() == QUDA_CUDA_FIELD_LOCATION) { copy(dynamic_cast<const cudaColorSpinorField&>(src)); } else if (src.FieldLocation() == QUDA_CPU_FIELD_LOCATION) { loadCPUSpinorField(src); } else { errorQuda("FieldLocation not supported"); } }
// creates a copy of src, any differences defined in param cudaColorSpinorField::cudaColorSpinorField(const ColorSpinorField &src, const ColorSpinorParam ¶m) : ColorSpinorField(src), v(0), norm(0), alloc(false), init(true) { // can only overide if we are not using a reference or parity special case if (param.create != QUDA_REFERENCE_FIELD_CREATE || (param.create == QUDA_REFERENCE_FIELD_CREATE && src.SiteSubset() == QUDA_FULL_SITE_SUBSET && param.siteSubset == QUDA_PARITY_SITE_SUBSET && src.FieldLocation() == QUDA_CUDA_FIELD_LOCATION) ) { reset(param); } else { errorQuda("Undefined behaviour"); // else silent bug possible? } fieldLocation = QUDA_CUDA_FIELD_LOCATION; create(param.create); if (param.create == QUDA_NULL_FIELD_CREATE) { // do nothing } else if (param.create == QUDA_ZERO_FIELD_CREATE) { zero(); } else if (param.create == QUDA_COPY_FIELD_CREATE) { if (src.FieldLocation() == QUDA_CUDA_FIELD_LOCATION) { copy(dynamic_cast<const cudaColorSpinorField&>(src)); } else if (src.FieldLocation() == QUDA_CPU_FIELD_LOCATION) { loadCPUSpinorField(dynamic_cast<const cpuColorSpinorField&>(src)); } else { errorQuda("FieldLocation %d not supported", src.FieldLocation()); } } else if (param.create == QUDA_REFERENCE_FIELD_CREATE) { if (src.FieldLocation() == QUDA_CUDA_FIELD_LOCATION) { v = (dynamic_cast<const cudaColorSpinorField&>(src)).v; norm = (dynamic_cast<const cudaColorSpinorField&>(src)).norm; } else { errorQuda("Cannot reference a non cuda field"); } } else { errorQuda("CreateType %d not implemented", param.create); } }