bool_t SyncSession::OnRead(EventResult *evr) { bool_t ret = FALSE; if(sock_.Status() != Socket::STATUS_CONNECTED) { ECILA_ERROR(("[SyncSession::OnWrite] "ECILA_FI64U"\n", UIDX())); return FALSE; } char_t *buffer = recv_buffer_->GetInPtr(); int32_t remain = recv_buffer_->Remain(); int32_t nbytes = sock_.Recv((char_t*)buffer, remain); if(nbytes == Socket::ERR_TRANSFER) { return OnError(evr); } ret = recv_buffer_->ForwardInPtr(nbytes); if(!ret) { ECILA_TRACE(); return FALSE; } ret = pkt_handler_->HandleEvents(this->UIDX(), this, EVENT_READ); if(!ret) { ECILA_TRACE(); return FALSE; } if(recv_buffer_->Length() == 0) { recv_buffer_->Reset(); } return TRUE; }
/* * Applies U(1) gauge laplacian to phi_in, with background field u, * and returns in phi_out */ void lapl(size_t L, _Complex float *phi_out, _Complex float *phi_in, _Complex float *u) { #pragma omp parallel for for(int y=0; y<L; y++) for(int x=0; x<L; x++) { unsigned long int v00 = y*L + x; unsigned long int v0p = y*L + (x+1)%L; unsigned long int vp0 = ((y+1)%L)*L + x; unsigned long int v0m = y*L + (L+x-1)%L; unsigned long int vm0 = ((L+y-1)%L)*L + x; _Complex float p; p = phi_in[v0p]*u[UIDX(v00, 0)]; p += phi_in[vp0]*u[UIDX(v00, 1)]; p += phi_in[v0m]*conj(u[UIDX(v0m, 0)]); p += phi_in[vm0]*conj(u[UIDX(vm0, 1)]); phi_out[v00] = 4*phi_in[v00] - p; } return; }
bool_t SyncSession::OnWrite(EventResult *evr) { bool_t ret = FALSE; if(sock_.Status() != Socket::STATUS_CONNECTED) { ECILA_ERROR(("[SyncSession::OnWrite] "ECILA_FI64U"\n", UIDX())); return FALSE; } int32_t length = send_buffer_->Length(); if(length == 0) { send_buffer_->Reset(); IDemultiplexer *demultiplexer = Demultiplexer(); if(demultiplexer) { ret = demultiplexer->DisableEventMask(this, EVENT_WRITE); if(!ret) { ECILA_TRACE(); return FALSE; } } return TRUE; } char_t *buffer = send_buffer_->GetOutPtr(); int32_t nbytes = sock_.Send((char_t*)buffer, length); if(nbytes == Socket::ERR_TRANSFER) { return OnError(evr); } ret = send_buffer_->ForwardOutPtr(nbytes); if(!ret) { ECILA_TRACE(); return FALSE; } ret = pkt_handler_->HandleEvents(this->UIDX(), this, EVENT_WRITE); if(!ret) { ECILA_TRACE(); return FALSE; } if(send_buffer_->Length() == 0) { send_buffer_->Reset(); } return TRUE; }